黑马程序员技术交流社区

标题: 关于继承练习中出现的问题,求解答? [打印本页]

作者: 孙政    时间: 2013-5-2 11:23
标题: 关于继承练习中出现的问题,求解答?
本帖最后由 孙政 于 2013-5-3 10:57 编辑
  1. class Student
  2. {
  3.          Student( )
  4.          {
  5.                  System.out.println("student read");
  6.          }
  7.          Student(int x)
  8.          {
  9.                  System.out.println("student:"+x);
  10.          }
  11. }

  12. class Sun extends Student
  13. {
  14.          Sun ( )
  15.          {
  16.                  System.out.println("sun read");
  17.          }
  18.          Sun (int x)
  19.          {
  20.                  this( );
  21.                  super(6);
  22.                  System.out.println("sun:"+x);
  23.          }
  24. }

  25. class ExtendsDemo1
  26. {
  27.          public static void main(String[] args)
  28.         {
  29.                  Sun  s1=new Sun ( );
  30.                  Sun  s2=new Sun (5);
  31.          }
  32. }
复制代码
调试运行了哈,在this()和super()那里有问题,不知道为什么,请大家帮忙解释下?
作者: askyle    时间: 2013-5-2 11:30
简单解释:其实构造函数也是一个链条一样的东西,会调用最上面的那层钩子,然后依次不重复的往下。每个构造函数虽然原理是先调用super,但是当构造函数形成一个链条的时候,不会每次去调用。
之所以你的super放在哪里不对的原因是,编译器认为,你既然调用了this这个构造器,那么这个构造器肯定会找到你的super并且调用,那么你在这里调用super是想迫使它调用两次父类的构造器,根据我上面的那个原理,是不成立的,所以编译不通过。
super() 它的作用:执行父类的构造方法
                                this()  它的作用:执行本类的构造方法

                                super()与this()在使用时注意事项
                                       
                                        1.它们只能出现在构造方法中

                                        2.它们如果要出现,必须是构造方法中的第一句.                        

                                        3.super()与this()不能共存

作者: wudongzhe    时间: 2013-5-2 11:37
楼上说的很好 你这里主要就是super()与this()不能共存。
作者: 吴传淦    时间: 2013-5-2 11:42
子类的构造函数默认有父类的空参数构造函数在第一行,所以第22行你需要调用父类带参数的构造行数应该放在第一行。因你又需要调用子类空参数的构造函数,子类默认的构造函数也第一行有父类的空参数构造函数构造函数。所以你想要调用父类带参数构造函数又需要调用子类空参数构造函数的话应该把调用父类带参数的构造函数放到子类空参数构造函数那里调用。
class Student
{
         Student( )
         {
                 System.out.println("student read");
         }
         Student(int x)
         {
                 System.out.println("student:"+x);
         }
}

class Sun extends Student
{
         Sun ( )
         {
                super(6);  
                 System.out.println("sun read");
         }
         Sun (int x)
         {
                 this();
                 
                 System.out.println("sun:"+x);
         }
}

class ExtendsDemo1
{
         public static void main(String[] args)
        {
                 Sun  s1=new Sun ( );
                 Sun  s2=new Sun (5);
         }
}
作者: 孙政    时间: 2013-5-2 14:19
askyle 发表于 2013-5-2 11:30
简单解释:其实构造函数也是一个链条一样的东西,会调用最上面的那层钩子,然后依次不重复的往下。每个构造 ...

谢谢!明白了!




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