我认为java不会使用四个值初始化a
。但我错了,你能解释一下这是怎么做到的吗?我的意思是当构造函数调用时它会做什么,因为我没有在构造函数中初始化a
。
class A {
int[] a = {1,2,3,4};
A() {
a[0] = 3;
}
}
class ClassTest1 {
public static void main(String args[]) {
A b = new A();
System.out.println("hey " + b.a[0] );
System.out.println("hey " + b.a[1] );
}
}
如果您详细解释并使用一些外部资源来了解内部,那么新手(我)可能会更好。
答案 0 :(得分:4)
当你有int[] a = {1,2,3,4}
时,它会将该行编译到构造函数的顶部。所以你的构造函数看起来真的像这样:
a = {1,2,3,4};
a[0] = 3;
现在,这是对发生的事情的一个非常简单的定义。如果你有多个构造函数,你可以将它视为将它放在所有构造函数中,但你也可以将它视为仅将其放入其中一个(实际调用的那个......)。
考虑一下:
class Counter {
static int nextId = 0;
static int nextId() { return nextId++; }
final int id = nextId();
final String name;
public Counter() {
this("Unnamed counter");
}
public Counter(String name) {
this.name = name;
}
}
因此,您可以选择创建一个没有名称的计数器,并且您只获得一个默认名称。现在从上面的例子中,你可以推断你的构造函数神奇地变成了以下内容:
public Counter() {
this.id = nextId();
this("Unnamed counter");
}
public Counter(String name) {
this.id = nextId();
this.name = name;
}
但我们知道这不行 - 它试图在泛型构造函数中设置id
,但后来进入命名构造函数并尝试再次设置它。一旦设置了最终变量,就无法设置它!
所以相反,我们可以这样想:无论我们实际调用的构造函数是什么,都会得到额外的初始化行,但是那些可能被链接的构造函数不会获得额外的行。