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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我为你着迷 金牌黑马   /  2015-2-3 09:10  /  1738 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 我为你着迷 于 2015-2-3 09:12 编辑

class Super
  {
          int i=0;
          public Super(String a)
          {
                  System.out.println("A");
                  i=1;
          }
          public Super()
          {
            System.out.println("B");
            i+=2;
          }
  }

  class Demo extends Super
  {
          public Demo(String a)
          {
            
                  System.out.println("C");
                  i=5;
          }
          public static void main(String{} args)
          {
                  int i=4;
                  Super d=new Demo("A");
                  System.out.println(d.i);
          }
  }

14 个回复

倒序浏览
没有结果
回复 使用道具 举报

啊  为什么呢
回复 使用道具 举报
运行了呀,提示错误
回复 使用道具 举报
本帖最后由 Ender亮 于 2015-2-3 10:50 编辑

主函数:
第一句:新建一个变量,对i赋值(但是这个i同下面对象里的不是同一个i,对象里的I放在堆中,这个i在栈中。)
第二句:新建一个子类对象,赋值给父类引用:子类对象建立时,先会给i赋值,i为0,然后调用构造函数:public Demo(String a),它的函数体里第一行隐藏了父类构造函数Super();所以去调用Super(),打印B,i变为了2;回Demo(String a)中来,执行第一句,打印C,i被更改为5。然后新建立的对象被赋值给父类引用
第三句:打印d中的i,经过上面分析,d中的i此时为5,所以打印结果是5.

打印结果.png (266 Bytes, 下载次数: 12)

打印结果

打印结果

子类构造中隐藏了一个父类的构造.png (4.2 KB, 下载次数: 15)

子类构造函数中隐藏了父类构造函数

子类构造函数中隐藏了父类构造函数

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20 很给力!

查看全部评分

回复 使用道具 举报
Ender亮 发表于 2015-2-3 10:22
主函数:
第一句:新建一个变量,对i赋值(但是这个i同下面对象里的不是同一个i,对象里的I放在堆中,这个i ...

i为9 9是怎么来的?   i应该是一开始为0吧  i+=2  i变为2   最后被更改为5的吧  
回复 使用道具 举报
我为你着迷 发表于 2015-2-3 10:37
i为9 9是怎么来的?   i应该是一开始为0吧  i+=2  i变为2   最后被更改为5的吧   ...

对,我把0搞成9了,。。。
回复 使用道具 举报
你的Demo类中主函数写错了,mian(String[] args)中String后是[],不是{},
我给你修改后运行结果是B、C、5.。这是Java的多态模式,父类声明子类,new Demo("A")在虚拟机初始化时
会先调用父类的Super()构造方法,所以会先打印出B,接着是子类Demo的初始化,因为含有参数A,所以会使用第二个初始化方法,打印出C,接着d.i对调用子类的字段内容,子类中i=5,所以最终的结果为:B、C、5.

主要考察的是,Java的多态机制,以及Java初始化时构造方法的调用,你可以好好看看毕老师这方面的视频,讲的很细致,加油。

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20 嗯加油

查看全部评分

回复 使用道具 举报
B
C
5
1.Demo类先运行基类Super的构造函数Super()
2.i的值最终由Demo的构造函数确定
回复 使用道具 举报
哥们,主函数错了。。。public static void main(String{} args)
→public static void main(String[] args)
结果是
B
C
5

多态创建对象的时候会先走父类的空参数构造函数。所以第一个是b,因为子类构造函数的第一行是一个super()
然后走自己的带参数的构造函数是c
最后5是子类构造函数里初始化的。
在类继承的时候子类会先运行自己的构造函数,一般第一行是super(),这样就引用了父类的空参数构造函数。

回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-2-13 01:16:20
11#
学习了。。。
回复 使用道具 举报
结果是:  
B
C
5
回复 使用道具 举报
水贴?????????????
回复 使用道具 举报
Mr.JUN 发表于 2015-2-13 18:19
水贴?????????????

这怎么能是水贴呢  这个题还是很好的 起码我相信有好多人看到这个题可能都会想错 并不是所有的人都会像你这样看一眼就知道答案的
回复 使用道具 举报
我为你着迷 发表于 2015-2-13 19:37
这怎么能是水贴呢  这个题还是很好的 起码我相信有好多人看到这个题可能都会想错 并不是所有的人都会像你 ...

口误~~~不好意思,哈哈,原谅我好吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马