黑马程序员技术交流社区

标题: 写出程序的结果。 [打印本页]

作者: 我为你着迷    时间: 2015-2-3 09:10
标题: 写出程序的结果。
本帖最后由 我为你着迷 于 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);
          }
  }


作者: 浮夸    时间: 2015-2-3 09:37
没有结果
作者: 我为你着迷    时间: 2015-2-3 10:13
浮夸 发表于 2015-2-3 09:37
没有结果

啊  为什么呢
作者: 浮夸    时间: 2015-2-3 10:15
运行了呀,提示错误
作者: Ender亮    时间: 2015-2-3 10:22
本帖最后由 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, 下载次数: 31)

打印结果

打印结果

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

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

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

作者: 我为你着迷    时间: 2015-2-3 10:37
Ender亮 发表于 2015-2-3 10:22
主函数:
第一句:新建一个变量,对i赋值(但是这个i同下面对象里的不是同一个i,对象里的I放在堆中,这个i ...

i为9 9是怎么来的?   i应该是一开始为0吧  i+=2  i变为2   最后被更改为5的吧  
作者: Ender亮    时间: 2015-2-3 10:49
我为你着迷 发表于 2015-2-3 10:37
i为9 9是怎么来的?   i应该是一开始为0吧  i+=2  i变为2   最后被更改为5的吧   ...

对,我把0搞成9了,。。。
作者: 零点Crazy    时间: 2015-2-3 11:08
你的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初始化时构造方法的调用,你可以好好看看毕老师这方面的视频,讲的很细致,加油。
作者: fengjie    时间: 2015-2-12 20:07
B
C
5
1.Demo类先运行基类Super的构造函数Super()
2.i的值最终由Demo的构造函数确定
作者: coolmiao13    时间: 2015-2-12 22:59
哥们,主函数错了。。。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
学习了。。。
作者: ~我思故我在~    时间: 2015-2-13 17:52
结果是:  
B
C
5

作者: Mr.JUN    时间: 2015-2-13 18:19
水贴?????????????
作者: 我为你着迷    时间: 2015-2-13 19:37
Mr.JUN 发表于 2015-2-13 18:19
水贴?????????????

这怎么能是水贴呢  这个题还是很好的 起码我相信有好多人看到这个题可能都会想错 并不是所有的人都会像你这样看一眼就知道答案的
作者: Mr.JUN    时间: 2015-2-13 22:05
我为你着迷 发表于 2015-2-13 19:37
这怎么能是水贴呢  这个题还是很好的 起码我相信有好多人看到这个题可能都会想错 并不是所有的人都会像你 ...

口误~~~不好意思,哈哈,原谅我好吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2