【问题标题】:Why can't we have this() and super() together in Java? [duplicate]为什么我们不能在 Java 中同时拥有 this() 和 super() ? [复制]
【发布时间】:2012-06-06 18:25:11
【问题描述】:

我有这个程序:

public class A
{
    public A(){
    System.out.println("I am in A");
    }

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

class B extends A
{   
    public B(){
    System.out.println("I am in B");
    }

    public B(String s){
    this();
    super();
    System.out.println("I am in B as " + s);
    }
}

现在为什么我不能调用Bthis 构造函数来调用默认构造函数?这给了我编译时错误。

【问题讨论】:

  • 通常 super() 调用应该给你一个错误。构造函数必须是构造函数中的第一条语句;)
  • 只有在超类没有默认构造函数或没有参数列表的构造函数时,super()才会报错

标签: java constructor default-constructor


【解决方案1】:

thissuper 必须是构造函数中的第一行。

已编辑:

语言规范

8.8.7。构造函数体

构造函数主体的第一条语句可能是显式的 调用同一类的另一个构造函数或直接 超类(第 8.8.7.1 节)。

【讨论】:

  • 你能具体说明你在说什么吗,意思是this();或超级();可以在第一行,不能同时在第一行,你是说这样的“this() super();”
  • 这两个语句中的一个可以是第一行,尝试重新阅读我添加到答案中的规范中的引用。
  • 是的,我只知道一个,但是当它们对执行没有太大影响时,为什么不都知道呢
  • 如果你开发一些产品,你会有一些规格和限制,所以,你不能随意使用这两个花蕊,因为它是在规范中描述的!
【解决方案2】:

this() 调用同一类中的另一个构造函数。

super() 调用一个超级构造函数。如果没有显式写入super(),编译器将隐式添加一个。因此,您最终将调用super() 两次。

所以,两者都是不允许的。


编辑

在您的代码上下文中:请记住,super() 应该始终是构造函数中的第一行。

【讨论】:

  • 1. this() 也可以是第一行 2。如果我们已经明确提到它,你最终不会调用 super() 两次
  • 如果this()super() 都在那里,那么 super 必须是第一行。出于同样的原因,我专门编写了 - 在您的代码上下文中。我在哪里说过 super() 如果我们明确提到它会被调用两次?
  • 如果 super 是第一行,那么它不会编译说 this() 应该是第一行,你会写“因此,你最终会调用 super() 两次。”
  • 逻辑上的配对。人们赞成这个答案是有原因的。
  • 如果所有人的想法都一样,那么没有人会对生活有任何怀疑...... :)
【解决方案3】:

经过进一步思考,我的回答如下所示基本上是正确的,但缺乏一些细微差别。本质上,您可以调用一次超级构造函数。这是为了确保您的超类只构造一次。这意味着给定构造函数的第一行可以是对当前类中的另一个构造函数的调用,也可以是对超类中的构造函数的调用。这也意味着您只能在任何给定的构造函数中调用另一个构造函数一次;您必须选择调用当前或超类中的一个。这确保了所有超类将在当前对象之前完全构造。

旧解释:

根本原因是必须先构造所有超类,然后才能构造子类。为此,如果构造函数的第一行不存在这样的调用,Java 将隐式调用 super()。覆盖此行为的唯一方法是在您的超类中显式调用不同的构造函数。基本上,Java 必须先创建层次结构,然后才能创建。

把你的构造函数放在第一位违反了这个要求,因此是非法的。

【讨论】:

    【解决方案4】:

    根据 Java,this() 和 super() 应该是构造函数中的第一条语句。现在的重点是我们不能同时将两者都写为第一行。如果你写 this() 而不是 super,不要指望super 将被隐式调用。 它就这么简单。你没有选择将它们一起写在一个构造函数体中

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 2014-03-27
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2018-09-27
      • 2012-05-10
      相关资源
      最近更新 更多