初始化类

时间:2012-11-07 21:24:39

标签: java class object initialization

这是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();对象创建,这是否意味着该类不会按上述顺序初始化? 最好的问候

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

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

B类中,只会标记 static 标记的对象,因为它们不需要实例来初始化它们。为你的B级调用。

 A a = new A(2);

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