本帖最后由 吴杰栋 于 2014-9-3 14:26 编辑
- package com.itheima;
- class Fu{
- int a = 99;
- public Fu(){
- System.out.println("父类的构造方法");
- show();
- }
- public void show(){
- System.out.println("父类的show :"+a);
- }
- }
- class Zi extends Fu{
- int a = 8;
- public Zi(){
- System.out.println("子类的构造方法");
- show();
- }
- public void show(){
- System.out.println("子类的show :"+a);
- }
- }
- public class Demo03 {
- public static void main(String[] args) {
- Zi z = new Zi();
- }
- }
复制代码 运行结果是:父类的构造方法子类的show :0
子类的构造方法
子类的show :8
按照我的理解,有继承关系的时候,在子类初始化的时候,肯定先去找父类的构造方法,那么在父类构造方法初始化的时候,子类中的a变量还没显示初始化,所以在父类中show里面的变量a是默认的0,而由于子类override了父类中的show方法,所以在输出的时候,会输出子类的show:0.......
不知道我这么理解是不是正确的,求各位老司机指点.........
------------------------------------------------------------------------------------------------------------------------------------------------------
(1)new Zi的时候,Zi进入堆中,由于它有父类的存在,发生2个动作,成员变量的默认初始化,在堆中会出现2个变量a,都是默认0
(2)执行Zi的构造方法,由于Zi构造方法有super()的存在,会把Fu的构造方法加入栈中去,这个时候将Fu中的变量初始化,也就是在堆中有个属于Fu的a这个时候是99
(3)Fu初始化完毕之后,去执行里面的show方法,方法的调用是和对象相关的,在这里,是Zi这个对象在调用,所以是执行Zi中的show(),而属于Zi的a还是0;所以输出的是子类show方法,而且a是0
(4)Fu的构造执行完毕后,轮到了Zi,然后就轮到Zi中的成员变量初始化,这个时候属于Zi的a就是8了
在刚开始执行到main方法的时候,会在堆中对成员变量进行默认初始化,在构造方法里面有3步, super() 成员变量显示初始化 构造代码块执行
|
|