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

源代码:

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,     最终结果:

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值