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

2 回答 2

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则不会被初始化,因此A(int i)不会调用构造函数。

于 2012-11-07T21:26:47.230 回答
2

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

在您的B 类中,只有标记为静态的对象将被初始化,因为它们不需要类的实例来初始化它们。供您的 B 类调用。

 A a = new A(2);

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

于 2012-11-07T21:28:17.210 回答