调用构造函数时会发生什么(在此上下文中是清晰的概念)?

时间:2013-07-11 20:18:32

标签: java constructor runtime

我认为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] );
    }
}

如果您详细解释并使用一些外部资源来了解内部,那么新手(我)可能会更好。

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,但后来进入命名构造函数并尝试再次设置它。一旦设置了最终变量,就无法设置它!

所以相反,我们可以这样想:无论我们实际调用的构造函数是什么,都会得到额外的初始化行,但是那些可能被链接的构造函数不会获得额外的行。