日期:2014-05-20  浏览次数:20792 次

java对象创建过程问题
class Fu
{
int num = 10;
Fu()
{
show();//在内存中调用这个方法时对象还没有创建完成,怎么会找到num的值呢?????
}
void show()
{
System.out.println("Fu num="+num);
}
}
class Zi extends Fu
{
int num = 111;
Zi()
{
show();
}
void show()
{
System.out.println("Zi num="+num);
}
}
class Test
{
public static void main(String[] args)
{
Fu f = new Fu();
Fu f2 = new Zi();
}
}


此时还没有把堆内存地址赋给Fu类引用变量f,show()中的num怎么拿到的值呢???
------解决方案--------------------
属性初始化要先于方法
------解决方案--------------------
创建对象的时候,类的一些资源会进行初始化进内存。也就是说,在你创建对象的时候也会对属性进行初始化,应该是在执行构造方法之前,所以show方法中是能调用到属性值的。
------解决方案--------------------
new 一个对象时候,先在堆上开辟一块空间,并清0. 此时Zi的num是0

然后基类构造器被调用,因此此时zi的num仍然是0,所有会有一个 0

基类构造器完成之后,实例变量初始化,这时zi的nun初始化为111

最后 子类构造器执行。
------解决方案--------------------
Fu f = new Fu();

这句代码的执行过程:
先初始化num的值为10,然后再执行构造器所以输出的num是10

Fu f2 = new Zi();

这句代码的执行过程稍微复杂些,因为涉及继承:
当然是先构造父类子对象,但是此时num还没有初始化,所以输出的num为0
然后再构造子类对象,此过程先初始化num为111,然后执行构造函数,输出num为111

另外,你若想弄清楚对象创建过程这样的原理性问题,强烈建议你看看《Java编程思想》这本书,就你提的这个问题上面阐述的很清楚的