考虑下面的简单代码,A中包含B,C,而B中又包含C:
class A
{
private B b;
private C c =new C("default value");
public A()
{
b = new B(c);
}
//some geter/setter method...
}
class B
{
private C c;
public B(C c)
{
this.c = c;
}
//some geter/setter method...
}
class C
{
private String str ;
public C(String str)
{
this.str = str;
}
//some geter/setter method...
}
下面有一个D,继承A:
class D extends A
{
public D(String str)
{
super(); //有没有这句结果都一样,因为在子类的构造函数中会自动调用父类的构造函数,所以不必显式调用。
this.setC(new C(str));
//this.setB(new B(new C(str)));
}
}
另外有一个单独的测试类TestInit:
public class TestInit
{
public static void main(String[] args)
{
D d = new D("new value");
System.out.println(d.getC().getStr());
System.out.println(d.getB().getC().getStr());
}
}
输出结果为:
new value
default value
如果我们把D改成这样:
class D extends A
{
public D(String str)
{
super();
//this.setC(new C(str));
this.setB(new B(new C(str)));
}
}
则输出结果为:
default value
new value
这就证实了java中类的初始化过程是这样的:
先父类再子类,先成员变量再构造函数。