【Java】关于构造函数
我简单地总结了一下。
构造函数是一个什么概念
-
インスタンス化のタイミングで呼び出される特殊なメソッド
- インスタンス化のタイミングで呼び出される特殊なメソッド
- コンストラクターではメンバー変数の初期化など、事前処理系を記述するのが一般的
首先,我们来执行以下的示例代码。
public class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
this("えんどうゆうき", 27);
}
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
public class ConstructorBasic {
public static void main(String[] args) {
var p = new Person();
p.show();
}
}
えんどうゆうき(27歳)です。
处理成功。
如果更改了此处超载的构造函数的参数,则执行结果将不同。
public Person() {
this("えんどうゆず", 10);
}
执行结果
えんどうゆず(10歳)です。
如果在重载构造函数中不使用this关键字进行构造函数调用,则执行结果如下。
public Person() {
}
null(0歳)です。
这是因为成员变量具有零值。※局部变量必须进行初始化。
我曾经以为如果不进行构造函数的重载就不会出错,但是出现了以下错误。
public class Person {
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
* public Person() { this("えんどうゆず", 10); }
*/
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
コンストラクター Person() は未定義です
但是只要以下的话就不会出错。
public class Person {
public String name;
public int age;
/*
* public Person(String name, int age) { this.name = name; this.age = age; }
*
* public Person() { this("えんどうゆず", 10); }
*/
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
null(0歳)です。
这是因为默认构造函数是隐式生成的。
如果只定义了具有参数的构造函数,那么不会生成默认构造函数。只有当存在可调用的构造函数时,才会判定为错误。
只要移除构造函数的参数,就不会报错。它引用了成员变量的零值。
public class Person {
public String name;
public int age;
public Person() {
this.name = name;
this.age = age;
}
public void show() {
System.out.printf("%s(%d歳)です。\n", this.name, this.age);
}
}
null(0歳)です。
描述并重载接受参数的构造函数流程是标准的。
文献引用
自学Java最新版
请提供一个提示文本来指导处理您的请求。