您的位置:首页 > 其它

【继承】----子父类中的构造函数,子类的实例化过程内存图解

2016-10-08 20:07 316 查看
源代码:

classFu

{

Fu()

{

super();

show();

return;

}

void show()//普通方法

{

System.out.println("fu show");

}

}

classZi extends Fu

{

int num=8;

Zi()

{

super();

return;

}

void show()

{

System.out.println("zishow...."+num);

}

}

classExtendsDemo5

{

public static void main(String[]args)

{

Zi z=new Zi();

z.show();

}

}


1, 栈,堆,方法区开始划分。Main函数进栈,z进栈。(如图1)



2, 开始加载父类子类。先加载父类。Fu类进内存,Fu类里的构造方法和成员方法在方法区里进行加载(如图2)。


 

3, 接着加载子类。Zi类的构造方法和成员方法开始在方法区里加载(如图3)。



4, 子类和父类都加载完了以后。开始执行new Zi();,在堆里创建new Zi();,(如图4)。



5, Zi();的成员变量num也进入堆里。此时num的默认初始化值为0(如图4)。

6, 执行new Zi();对象时,调用Zi(){}构造函数。此时构造函数Zi(){}开始进栈(如图5)。



7, Zi构造方法里super();执行时,指向了父类的无参构造函数(如图6)。



8, 指向Fu类构造方法后,Fu(){}进栈,如图7。



9, Fu构造函数进栈以后执行里面的show()方法。这个时候所执行的show方法,并非父类里的show方法,

而是子类里的show方法。当子父类里有一模一样的方法时,子类的方法覆盖父类里的方法。所以此时先执行

子类里的show,运行show里的语句,得到结果:“zi show....0”。(如图8)在子类Zi构造方法后面语句

System.out.println(“zi consrun"+num);,这一句就输出值为8。

    


10,子类构造方法运行结束后,父类弹栈(如图9)。



10,     父类弹完栈之后,子类弹栈。Show方法进栈,继续运行下面的成员方法show,此时的show里的num值变为8,

因为是将局部变量的num=8赋给了成员方法里的变量。

所以此时输出的结果是:“zi show....8“。



 


11,             弹完栈以后,z就指向了对象。(如图)



12,     最终结果:

 


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  super 构造函数 继承
相关文章推荐