A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴杰栋 中级黑马   /  2014-9-3 10:23  /  1759 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴杰栋 于 2014-9-3 14:26 编辑
  1. package com.itheima;

  2. class Fu{
  3.         int a = 99;
  4.         public Fu(){
  5.                 System.out.println("父类的构造方法");
  6.                 show();
  7.         }
  8.         public void show(){
  9.                 System.out.println("父类的show  :"+a);
  10.         }
  11. }

  12. class Zi extends Fu{
  13.         int a = 8;
  14.         public Zi(){
  15.                 System.out.println("子类的构造方法");
  16.                 show();
  17.         }
  18.         public void show(){
  19.                 System.out.println("子类的show  :"+a);
  20.         }
  21. }
  22. public class Demo03 {

  23.         public static void main(String[] args) {
  24.                 Zi z = new Zi();
  25.         }

  26. }
复制代码
运行结果是:父类的构造方法子类的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() 成员变量显示初始化 构造代码块执行

11 个回复

倒序浏览
看的我也糊涂了,子类初始化调用父类的构造函数,父类构造函数里又调用show()函数,怎么输出:父类的构造方法子类的show  :0????
回复 使用道具 举报
先默认调用super,此时还没初始化,调用的是父类的构造方法(父类的show方法永远不会执行),然后初始化,执行子类的方法,总的来说你的理解没错啊
回复 使用道具 举报
我有一点不明白的是为什么父类的show永远不会执行???
回复 使用道具 举报
新新人类嘿嘿嘿 发表于 2014-9-3 13:15
我有一点不明白的是为什么父类的show永远不会执行???

子类继承了父类,就可以使用父类的方法show,子类重写了show方法,父类的show方法怎么执行啊
回复 使用道具 举报
暴走的小青春丶 发表于 2014-9-3 13:30
子类继承了父类,就可以使用父类的方法show,子类重写了show方法,父类的show方法怎么执行啊
...

可是执行父类构造的时候就应该执行完构造里面的所有语句啊,里面不就有调用自己的show吗
回复 使用道具 举报
新新人类嘿嘿嘿 发表于 2014-9-3 14:11
可是执行父类构造的时候就应该执行完构造里面的所有语句啊,里面不就有调用自己的show吗 ...

执行父类构造器时,会调用show方法,然后父类会看子类有没有show方法有的就调用子类的,没有就调用自己的,所以在父类构造器里千万不要调用被子类重写的方法,因为没用
回复 使用道具 举报
暴走的小青春丶 发表于 2014-9-3 14:21
执行父类构造器时,会调用show方法,然后父类会看子类有没有show方法有的就调用子类的,没有就调用自己的 ...

如此哦,明白了,谢谢哈
回复 使用道具 举报
新新人类嘿嘿嘿 发表于 2014-9-3 14:22
如此哦,明白了,谢谢哈

他解释的还是不是太准确,方法的调用是和对象相关的,这里子啊Fu中调用show的时候,其实是Zi构造中的super,Zi指向了Fu,所以Fu中的show是和Zi对象来搭配起来的
回复 使用道具 举报
赞一个!!!!!!!!!
回复 使用道具 举报
如果将子类中的show方法重新定义一个方法名,差不多跟楼主分析的一样,可以试一下。
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马