在产生一个类的对象的时候,直观上应该最先直接调用一个类的构造器,然后再生成其他的一些东西,然后事实并非如此:
且看下面这段程序:
我创建了一个Root类,令其中含有名为Component1,2,3的类的一个实例,从Root中派生一个类Stem,也含有上述的各组成部分,所有的类都带有可以打印出相关信息的构造器,以此来观察:
package exercise7;
public class E09 {
public static void main(String[] args){
new Stem();
}
}
class Component1{
Component1(int i){
System.out.println("Component1"+i);
}
}
class Component2{
Component2(int i){
System.out.println("Component2"+i);
}
}
class Component3{
Component3(int i){
System.out.println("Component3"+i);
}
}
//构造的时候先调用C1 C2 C3的构造器呢!
class Root{
Component1 C1=new Component1(1);
Component2 C2=new Component2(1);
Component3 C3=new Component3(1);
Root(){
System.out.println("in Root");
}
}
class Stem extends Root{
Component1 C1=new Component1(2);
Component2 C2=new Component2(2);
Component3 C3=new Component3(2);
Stem(){
System.out.println("in Stem");
}
}
在我的最初的想法里,应该是这样的输出结果才对:
in Root
Component11
Component21
Component31
in Stem
Component12
Component22
Component32
然而结果却是这样的:
Component11
Component21
Component31
in Root
Component12
Component22
Component32
in Stem
我以为是因为我在Root中语句的顺序出了这样的问题,所以我调整了一下顺序,改成如下这样:
class Root{
Root(){
System.out.println("in Root");
}
Component1 C1=new Component1(1);
Component2 C2=new Component2(1);
Component3 C3=new Component3(1);
}
但即使改成这样,最后的输出结果还是没有改变的,所以在创建一个类的实例时,先会生成其他的类,调用他们的构造器,然后再调用自己的。
而如果在Root类中仅仅产生一个引用,而没有生成新的对象,则不会调用Component的构造器:
class Root{
Root(){
System.out.println("in Root");
}
Component1 C1;//=new Component1(1);
Component2 C2;//=new Component2(1);
Component3 C3;//=new Component3(1);
}
这样的话结果就是这样:
in Root
Component12
Component22
Component32
in Stem
为了更进一步验证,我们在Root的构造器里也加入Component类的对象,这次参数是5:
class Root{
Root(){
Component1 C1=new Component1(5);
Component2 C2=new Component2(5);
Component3 C3=new Component3(5);
System.out.println("in Root");
}
Component1 C1=new Component1(1);
Component2 C2=new Component2(1);
Component3 C3=new Component3(1);
}
这样的输出为:
Component11
Component21
Component31
Component15
Component25
Component35
in Root
Component12
Component22
Component32
in Stem