meifage2211 2011-08-23 21:07
浏览 465
已采纳

为什么this和super不能同时出现在一个构造函数里面?

为什么this和super不能同时出现在一个构造函数里面?

class A
{
A()
{
System.out.println("A");
}

}

class B extends A
{
B()
{
// super(); //error
this(3);
System.out.println("B");

}

B(int x)
{
System.out.println("B2");

}

public static void main(String[] args)
{
B a=new B();
}
}

关于this,super不是很理解。。就像上面那个例子。

问1:不是每个构造函数默认第一条语句都是调用super么?反正默认也是加上,可是我加了super()以后反而会出错。。。不加没事。

问2:是不是所有构造函数里面第一条语句都会调用super?还是只要一个构造函数调用一个super()其它的就不在调用了?如果按照上面的运行。
我想是否应该是 先运行B()中默认的super(),这样,要先执行一次A()中的System语句,然后在回到B()中,继续运行this(3),在进入B(int x)
进入后在B(int x)中在默认运行super(),在回到B()中。。。那么输出应该是
A
A
B2
B

可是结果输出却是
A
B2
B
这好像说明super()只运行了一次。。那么是说this(3)中的super()没有运行么?
是不是不管子类有多少个构造方法,但调用super只调用一次?

谢谢,麻烦不忙时候讲讲

  • 写回答

6条回答 默认 最新

  • AngelAndAngel 2011-08-23 22:46
    关注

    简单解释:其实构造函数也是一个链条一样的东西,会调用最上面的那层钩子,然后依次不重复的往下。每个构造函数虽然原理是先调用super,但是当构造函数形成一个链条的时候,不会每次去调用,就和js的原型差不多。

    之所以你的super放在哪里不对的原因是,编译器认为,你既然调用了this(3)这个构造器,那么这个构造器肯定会找到你的super并且调用,那么你在这里调用super是想迫使它调用两次父类的构造器,根据我上面的那个原理,是不成立的,所以编译不通过。

    欢迎采纳,不懂的可以联系我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决