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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-7 13:27  /  2704 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么this语句与super语句不能存在于同一构造函数中?

错误代码:
class Fu
{
        Fu( )
        {
                System.out.println("fu run");
        }
        Fu(int x)
        {
                System.out.println("fu:"+x);
        }
}

class Zi extends Fu
{
        Zi( )
        {
                System.out.println("zi run");
        }
        Zi(int x)
        {
                this( );
                super(7);  //报错的位置。
                System.out.println("zi:"+x);
        }
}

class ExtendsDemo
{
        public static void main(String[] args)
        {
                Zi z1=new Zi( );
                Zi z2=new Zi(6);
        }
}

4 个回复

倒序浏览
super() 和 this() 都要求在构造函数中的第一句位置调用,所以不可能在同一构造中同时调用super()和this()。
super()和this()分别是显示的调用了父类和子类的无参构造函数,如此JVM就不会自动调用默认的构造函数。
其实在不显示调用super()和this(),JVM还是会调用。
因此,如果你在构造函数显示的调用构造super()或者this(),必须是要放在第一个语句上。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
原因很简单因为JAVA规定用this或super调用构造函数的语句必须是函数中的第一个语句,至于为什么,毕老师的视频中有解释:
因为如果this或super的语句不是第一句,那么this或super语句会把在它们前面的初始化动作覆盖掉。
例如下面的程序:
class person
{
        private String name;
        private int age;

        person()
        {

        }
        person(String name)
        {
                this.name = "haha";
        }
        person(String name, int age)
        {
                this.name = name;  //此处p.name = "lisi"----------1
                this(name);   //结果这里p.name又被改成"haha"----------2
                this.age = age;
        }
}

class PersonDemo
{
        public static void main(String[] args)
        {
                person p = new person("lisi",30);  //想让p.name = "lisi",结果却被改成"haha"
        }
}

所以结果不是想要得到的值。super同理。
所以this和super语句必须是函数的第一句。1,2两句对调,程序便可编译通过。


评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. class Fu
  2. {
  3.         Fu( )
  4.         {
  5.                 System.out.println("fu run");
  6.         }
  7.         Fu(int x)
  8.         {
  9.                 System.out.println("fu:"+x);
  10.         }
  11. }

  12. class Zi extends Fu
  13. {
  14.         Zi( )
  15.         {
  16.                 System.out.println("zi run");
  17.         }
  18.         Zi(int x)
  19.         {
  20.                 this( );
  21.                 super(7);  //报错的位置。解释:因为Java规定this只能放在构造函数的第一行,而super的性质跟this是一样的,也只能放在第一行,所以就会报错!
  22.                 System.out.println("zi:"+x);
  23.         }
  24. }

  25. class ExtendsDemo
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 Zi z1=new Zi( );
  30.                 Zi z2=new Zi(6);
  31.         }
  32. }
复制代码
回复 使用道具 举报
{:soso_e197:}对于这个……路过
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马