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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张庚 中级黑马   /  2013-2-3 21:44  /  1407 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-6 14:38 编辑

这是代码:
class Fu
{
Fu()
{
  super();
  show();
  return;
}
void show()
{
  System.out.println("fu show");
}
}
class Zi extends Fu
{
int num = 8;
Zi()
{
  super();
  //-->通过super初始化父类内容时,子类的成员变量并未显示初始化。等super()父类初始化完毕后,
  //才进行子类的成员变量显示初始化。
  System.out.println("zi cons run...."+num);
  return;
}
void show()
{
  System.out.println("zi show..."+num);
}
}
class ExtendsDemo5
{
public static void main(String[] args)
{
  Zi z = new Zi();
  z.show();
}
}


图片在附件里面 太大了 压缩了

图片里面说的   父类的构造函数都加在栈里面了  为什么没有创建出父类对象?????

子类的实例化过程图解.rar

16.49 KB, 下载次数: 198

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

7 个回复

倒序浏览
朋友,你这道题很有趣。但是我很确切地告诉你,此时在子类生成时产生了父类对象,不过是隐式产生而已。子类调用super()并不是初始化父类内容,super()表示子类沿用父类的构造器。
回复 使用道具 举报
Zi()
{
  super.show();//如果这句话被执行,就表示此时系统隐式生成了父类对象。
  //因为你并没有手动创建父类对象,就可以super代替父类对象。这下明白了吧。
  System.out.println("zi cons run...."+num);
  return;
}
回复 使用道具 举报
class Fu
{
Fu()
{
  super();
  /*
   * 我也有点疑惑,为什么父类构造器的show()方法没有被执行,为了证明生成子类之前
   * 产生了父类对象,我写了下面的打印语句,是可以正常输出的,我再好好想想,为什么
   * show()没有被正确执行。我很抱歉,我之前的理解有错误。隐式产生的对象也应该
   * 有正常的输出。
   */
  System.out.println("father");
  show();
}
回复 使用道具 举报
class Fu
{
Fu()
{
  super();
  /*
   * 我也有点疑惑,为什么父类构造器的show()方法没有被执行,为了证明生成子类之前
   * 产生了父类对象,我写了下面的打印语句,是可以正常输出的,我再好好想想,为什么
   * show()没有被正确执行。我很抱歉,我之前的理解有错误。隐式产生的对象也应该
   * 有正常的输出。
   */
  System.out.println("father");
  show();
}
回复 使用道具 举报
{:soso_e113:}
回复 使用道具 举报
     朋友,我重新写例子测试过了,如果show方法被子类重写了,父类构造器里的show方法,不再获得执行机会,所以你没有看到相应输出,但不要据此怀疑子类产生时没有生成父类对象,我前面已经证明过了。没有必要在这个细节上纠结了。还有,我要提醒一下,你的这个例子写的有点乱,return和super()在你的例子里其实都用不上,打印语句写的也不够清晰,其他人看起来会比较费力。
class Base
{
        Base()
        {
                show();
        }
        void show()
        {
        System.out.println("执行父类的show方法");
        }
}
class Child extends Base
{
        Child()
        {
        }
        void show()
        {
                System.out.println("执行子类的show方法");
        }
}

public class MyTest {
   
     public static void main(String[] args)
     {
              new Child();
     }
}

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
这是看视频时候 老师的源码  你藐视老毕啊 呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马