2012-11-07 205 views
0

这是Java代码片段。初始化类

class A{ 
    public A() { } 
    public A(int i) { System.out.println(i); } 
} 
class B{ 
    static A s1 = new A(1); 
    A a = new A(2); 
    public static void main(String[] args){ 
     B b = new B(); 
     A a = new A(3); 
    } 
    static A s2 = new A(4); 
} 

执行顺序如下:1,4,2,3因为类的初始化以这种方式执行。 但是如果删除了B b = new B();对象创建,那么这是否意味着该类不会按上述顺序初始化? 最好的问候

+4

当你尝试时发生了什么?如果你没有创建一个新的B实例*,那么这意味着什么? B是否有任何实例变量?如果您不创建B的实例,是否会创建任何B实例变量?考虑一下。 –

回答

5

如果删除B b = new B(),那么你的声明为实例变量引用(A a)不会与实例初始化new A(2)

只有静态变量加载并在类加载时初始化。实例变量仅在实例化类时初始化。

理由是: -

A a = new A(2); 

你的上述代码转换为: -

A a; 
public B() { 
    super(); 
    a = new A(2); 
} 

由编译器。 B()是编译器提供的默认构造函数,因为您没有提供自己的构造函数。如果你已经声明了你自己的构造函数,那么初始化就会被添加到你的每个构造函数中。

所以,如果你不实例化你的B类,A a不会initalized,因此构造A(int i)将不会被调用。

+6

数组声明? –

+5

数组声明?? – PermGenError

+0

是编辑。错了。 –

2

如果您从主系统中删除B b = new B(),则只会打印1,4,3

B类仅对象标记为他们不要求一类的实例初始化它们静态将被初始化。为你的B类调用。

A a = new A(2); 

您需要创建该类的实例,就像您当前在您的代码中所做的那样。如果你删除它A a= new A(2)将不会被调用,因此,输出将是1,4,3