Java中对象的构建过程

如下代码:

public class Contruct {
	private int value;

	public Contruct() {
		value=setValue();
		System.out.println("value=="+value);
		System.out.println("Contruct");
	}

	public int setValue() {
		System.out.println("setValue()");
		return 5;
	}
	
	public int value(){
		System.out.println("value()");
		return value;
	}
	
	static class SubContruct extends Contruct{
		public SubContruct(){
			System.out.println("SubContruct  num="+num);
		}
		private int num=10;
		public int setValue() {
			System.out.println("subContruct  setValue()");
			System.out.println("num=="+num);
			return num;
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SubContruct c=new SubContruct();
		int value=c.value();
		System.out.println(value);
	}

输出的结果:

subContruct  setValue()
num==0
value==0
Contruct
SubContruct  num=10
value()
0

由此可以看出对象的构建过程:

1.从Heap中分配内存,用以存放全部Instance变量以及这个对象的superclass 的专属数据

2.对象的Instance 变量初始化为默认值。  例:此时的value默认值为0,num默认值为0

3.调用superclass 的构造器,直到Object的构造器,然后依次从Object构造器返回。

4.在本体构造器执行之前,先为Instance变量赋值,然后才执行构造器。

你可只关注2、3、4点,根据这3点分析如下:

第2点分析结果已写出。从第3点开始:

此时先调用superclass Contruct 的构造器,先为value 赋值,因为value 无赋值操作,所以此时value的值为默认值0,由于superclass Contruct 的构造器中调用value=setValue()的操作,而setValue()的方法被subclass SubContruct 重写了,所以,此时调用的应是subclass Contruct  的setValue()方法,而这时,superclass Contruct的构造器还没执行完,所以subclass SubContruct 的构造器还没开始执行,此时的num值为默认值0。所以在superclass Contruct 的构造器中的value=setValue()的操作得到的value =0 。这时,superclass Contruct 执行完毕,value 赋值完后的值为0,接着调用本类的构造器SubContruct ,最终调用value()方法是得到的value值就为0.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值