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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 張帅 中级黑马   /  2013-9-23 08:11  /  1487 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 張帅 于 2013-9-24 07:38 编辑

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)
             {
                        i = 4;
                       Super d = new Demo(''A");
                       System.out.println(d.i);

              }
}
这道题 先读主函数 Super d = new Demo(''A")即父类的引用指向子类对象;,读public Demo(String a)这个构造函数,输出C,
然后读System.out.println(d.i);,i = 5; 打印结果为 C 5,但是答案为B C 5,解释下B怎么打印出来的?

评分

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

查看全部评分

7 个回复

倒序浏览
  1. class Demo extends Super
  2. {
  3.             public Demo(String a)
  4.             {
  5.                      //隐式调用了super(); 即父类Super的空参数构造函数
  6.                      super();
  7.                      System.out.println("C");
  8.                      i = 5;
  9.             }
  10.             public static void main(String[] args)
  11.              {
  12.                         i = 4;
  13.                        Super d = new Demo(''A");
  14.                        System.out.println(d.i);

  15.               }
  16. }
复制代码
我把super()显示调用了一下,且只能在方法的第一行调用。
生成对象时,先执行父类的构造函数,然后在执行子类的构造函数。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 太棒了!

查看全部评分

回复 使用道具 举报
周文斌 发表于 2013-9-23 08:20
我把super()显示调用了一下,且只能在方法的第一行调用。
生成对象时,先执行父类的构造函数,然后在执行子 ...

恩,懂了点。那 父类里面有两个 Super,为什么执行的 后面的那个Super....
回复 使用道具 举报
子类 继承了父类,先从父类查找,然后再在本类查找。
回复 使用道具 举报
張帅 发表于 2013-9-23 08:34
恩,懂了点。那 父类里面有两个 Super,为什么执行的 后面的那个Super....

隐式调用super() 又不是调用super(xxxxxx)啦~你要让他调用带参数的构造函数,必须显示调用啊啊~~
回复 使用道具 举报
張帅 发表于 2013-9-23 08:34
恩,懂了点。那 父类里面有两个 Super,为什么执行的 后面的那个Super....

默认的super()调用的是无参构造函数也就是第二个函数!
回复 使用道具 举报
乔兵 高级黑马 2013-9-23 12:39:49
7#
如果问题已经解决,请修改属性为已解决谢谢合作。
回复 使用道具 举报
朱艳 中级黑马 2013-9-23 12:40:50
8#
这个是因为你在new子类的时候 是对子类的实现  对子类的实现是按照先父类后子类的顺序执行的 而且 在子类中调用的父类构造函数是默认无参的 这样肯定是打印B 了 然后执行子类  C5 就是这样出来了啊  还有啊 你可以看一下程序的执行过成  知道的话 就能画出程序执行顺序 这样就不会丢值了  父类不是轻易继承的哦  还是接口最好了

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 很详细哦!鼓励一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马