繁体   English   中英

何时调用 Java 超级构造函数?

[英]When to call Java super constructors?

好的,所以我正在阅读这本 Java 书“Java 21 天”,作者提出了一些我认为在我读过的任何编程书中最令人困惑的主张。 我认为作者只是在表达观点方面做得很差。 这是最令人困惑的两个点,如果一些有经验的 java 开发人员能够更清楚地解释它们,我将不胜感激。

第 1 点:

构造函数不能被覆盖。 因为构造函数总是与当前的 class 同名,所以会创建新的构造函数而不是继承。 这在很多时候就足够了; 当您的类的构造函数被调用时,所有超类的具有相同签名的构造函数也会被调用。 因此,您继承的 class 的所有部分都可以进行初始化。

我明白他在说什么。 您必须在子类构造函数中使用 super() 构造函数来初始化超类的任何必要属性。 也就是说,如果超类构造函数需要 arguments,则可以通过 super() 传递这些 arguments。 但是当你说“当你的类的构造函数被调用时,对你的所有超类具有相同签名的构造函数也被调用”时,他绝对失去了我。 在那之前的那一行,他提到了构造函数是如何不被继承的,因为它们总是与 class 同名; 那么,他的意思是调用超类中具有相同签名的构造函数呢? 没有一个超类构造函数与子类的构造函数具有相同的签名,因为它们具有不同的名称。 有人可以澄清吗?

作者在第 2 点做了类似的陈述:

您不必在超类中调用与 class 中的构造函数具有相同签名的构造函数; 您必须仅为需要初始化的值调用构造函数。 事实上,您可以创建一个 class ,它的构造函数具有与任何超类的构造函数完全不同的签名。

,?。 再次? 有人可以在这里澄清一下,他说“创建一个 class 的构造函数,该构造函数的签名与任何超类的构造函数完全不同”,这不是隐含的情况。 构造函数必须具有与其所有超类不同的名称,因此也必须具有不同的签名。 再次,我真的很感谢Java开发者在这里的解释,因为我很困惑。

作者甚至没有提供任何代码来说明这些观点。 如果你能提供一些代码和你的解释,这对我来说将是非常有成效的。 谢谢。 让我知道是否需要澄清或添加更多上下文。

您正在阅读的文本具有误导性或错误。

听起来它想说的是,如果您有一个带有构造函数A(int)的 class A和带有构造函数B(int)A的子类B ,那么该构造函数将自动调用A(int)构造函数。

但事实并非如此。 您在子类中编写的任何构造函数都将隐式调用其超类的无参数构造函数,除非您显式调用super(...)

所以

class B extends A {
    B(int value) {
        // implicitly calls the no arguments constructor, A()
    } 
}

如果无参数构造函数不可用(不存在或私有),那么您必须在子类构造函数中调用super(...) ,从而提供与超类中可用构造函数匹配的 arguments。

https://docs.oracle.com/javase/tutorial/java/IandI/super.html

如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。

默认情况下,子类构造函数将调用不带参数的超级 class 构造函数。 这是隐含的。

class A {

}

class B extends A{
   int b;
   public B(int bParam) {
      // implicit super()  call to A
      b = bParam;
   }

}

但是假设您的超级 class 没有任何无参数构造函数并且您想要初始化一些超类变量,您将必须使用 arguments 进行显式 super() 调用。

class A {
   int a;
   public A(int aParam) {
      a = aParam;
   }

}

class B extends A{
   int b;
   public B(int aParam, int bParam) {
      //initialize a field in super class A
      super(aParam);
      b = bParam;
   }
}

因此,以下两条评论不正确。 这与相同的签名构造函数无关。 只会调用来自超级 class 的无参数构造函数。

这在很多时候就足够了; 当您的类的构造函数被调用时,所有超类的具有相同签名的构造函数也会被调用。

您不必在超类中调用与 class 中的构造函数具有相同签名的构造函数; 您必须仅为需要初始化的值调用构造函数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM