[Java] 类中构造器的调用顺序

在产生一个类的对象的时候,直观上应该最先直接调用一个类的构造器,然后再生成其他的一些东西,然后事实并非如此:

且看下面这段程序:

我创建了一个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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值