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