黑马程序员技术交流社区

标题: 自学求解。。 [打印本页]

作者: 張帅    时间: 2013-9-23 08:11
标题: 自学求解。。
本帖最后由 張帅 于 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怎么打印出来的?

作者: 周文斌    时间: 2013-9-23 08:20
  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()显示调用了一下,且只能在方法的第一行调用。
生成对象时,先执行父类的构造函数,然后在执行子类的构造函数。
作者: 張帅    时间: 2013-9-23 08:34
周文斌 发表于 2013-9-23 08:20
我把super()显示调用了一下,且只能在方法的第一行调用。
生成对象时,先执行父类的构造函数,然后在执行子 ...

恩,懂了点。那 父类里面有两个 Super,为什么执行的 后面的那个Super....

作者: 刘亮    时间: 2013-9-23 08:34
子类 继承了父类,先从父类查找,然后再在本类查找。
作者: 周文斌    时间: 2013-9-23 08:38
張帅 发表于 2013-9-23 08:34
恩,懂了点。那 父类里面有两个 Super,为什么执行的 后面的那个Super....

隐式调用super() 又不是调用super(xxxxxx)啦~你要让他调用带参数的构造函数,必须显示调用啊啊~~

作者: 黑马-马磊    时间: 2013-9-23 08:39
張帅 发表于 2013-9-23 08:34
恩,懂了点。那 父类里面有两个 Super,为什么执行的 后面的那个Super....

默认的super()调用的是无参构造函数也就是第二个函数!

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





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