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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙政 中级黑马   /  2013-5-2 11:23  /  1428 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙政 于 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()那里有问题,不知道为什么,请大家帮忙解释下?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

4 个回复

倒序浏览
简单解释:其实构造函数也是一个链条一样的东西,会调用最上面的那层钩子,然后依次不重复的往下。每个构造函数虽然原理是先调用super,但是当构造函数形成一个链条的时候,不会每次去调用。
之所以你的super放在哪里不对的原因是,编译器认为,你既然调用了this这个构造器,那么这个构造器肯定会找到你的super并且调用,那么你在这里调用super是想迫使它调用两次父类的构造器,根据我上面的那个原理,是不成立的,所以编译不通过。
super() 它的作用:执行父类的构造方法
                                this()  它的作用:执行本类的构造方法

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

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

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

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
楼上说的很好 你这里主要就是super()与this()不能共存。
回复 使用道具 举报
子类的构造函数默认有父类的空参数构造函数在第一行,所以第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);
         }
}

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
askyle 发表于 2013-5-2 11:30
简单解释:其实构造函数也是一个链条一样的东西,会调用最上面的那层钩子,然后依次不重复的往下。每个构造 ...

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