【继承】----子父类中的构造函数,子类的实例化过程内存图解
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, 最终结果:
相关文章推荐
- 03-(继承-子父类中的构造函数-子类的实例化过程-图解)1. 03-(继承-子父类中的构造函数-子类的实例化过程-图解)2 03-面向对象(继承-子父类中的构造函数-子类的实例化过程-图解3
- 继承—子父类的构造函数—子类的实例化过程
- 继承—子父类中的构造函数-子类的实例化过程
- Java重修之路(八)面向对象之继承,子父类中变量、函数、构造函数的特点,子类实例化过程。
- 继承之子父类中构造函数的特点之子类实例化过程
- 02-面向对象(继承-子父类中的构造函数-子类的实例化过程-细节) 02-面向对象(继承-子父类中的构造函数-子类的实例化过程-细节)2 02-面向对象(继承-子父类中的构造函数-子类的实例化
- java面向对象-子父类中构造函数的特点-子类实例化过程super
- JAVA子父类中构造函数的特点-子类实例化过程
- 面向对象(子父类中构造函数的特点-子类实例化过程)
- java面向对象——继承最终章--子类的实例化过程(内存)
- 面向对象-子父类中构造函数的特点(子类实例化过程)
- OO 中的继承分析:主要分析在编译和运行过程中 子类、父类 的字段和方法以及实例化时候在内存中分配 和 执行的先后,以及两个原则
- 面向对象-子父类中构造函数的特点(子类实例化过程)
- 面向对象(子父类中构造函数的特点-子类实例化过程)
- 面向对象第二个特征----继承III(子父类中构造函数初始化过程2)
- OO中的继承分析,主要分析在编译和运行过程中子类父类的方法、字段和实例化时候在内存中分配和执行的先后,以及两个原则
- 08-面向对象(继承-Java中的单继承和多重继承). 11-面向对象(继承-子父类中成员变量的内存图解) 11-面向对象(继承-子父类中成员变量的内存图解2
- Java对象的构造过程---子类继承父类时(非)静态块及构造函数等的执行顺序
- java基础之继承extends,以及子类实例化过程
- JAVA基础-子类继承父类实例化对象过程