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

何时调用Java超级构造函数?,java,class,object,oop,constructor,Java,Class,Object,Oop,Constructor,好的,我正在读这本Java书籍“21天内的Java”,作者提出了一些我认为是我读过的任何编程书籍中最令人困惑的观点。我认为作者在阐明观点方面做得很差。这里是两个最令人困惑的问题,如果一些有经验的java开发人员能够更清楚地解释它们,我将不胜感激 第1点: 不能重写构造函数。由于构造函数始终与当前类具有相同的名称,因此将创建新的构造函数,而不是继承新的构造函数。这在大多数情况下是足够的;调用类的构造函数时,也会调用所有超类具有相同签名的构造函数。因此,可以对继承的类的所有部分进行初始化 我想我明白

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

第1点:


不能重写构造函数。由于构造函数始终与当前类具有相同的名称,因此将创建新的构造函数,而不是继承新的构造函数。这在大多数情况下是足够的;调用类的构造函数时,也会调用所有超类具有相同签名的构造函数。因此,可以对继承的类的所有部分进行初始化


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

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

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

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


作者甚至没有提供任何代码来说明这些观点。如果你能提供一些代码和你的解释,这将是难以置信的生产力为我。谢谢如果需要澄清或添加更多上下文,请告诉我。

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

class A {

}

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

}
但是,假设您的超类没有任何无参数构造函数&您想要初始化某个超类变量,则必须使用参数进行显式的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 A {

}

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

}
但是,假设您的超类没有任何无参数构造函数&您想要初始化某个超类变量,则必须使用参数进行显式的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;
   }
}
所以下面的两条评论是不正确的。它不是关于同一个签名构造函数。只调用超类中的参数构造函数

这在大多数情况下是足够的;当类的构造函数为
调用,则为所有 超类也被称为

您不必在超类中调用具有 与类中的构造函数相同的签名;你必须打电话给警察 构造函数仅用于需要初始化的值


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

听起来它试图说的是,如果你有一个类
a
和一个构造函数
a(int)
以及一个
a
的子类
B
和一个构造函数
B(int)
,那么这个构造函数会自动调用
a(int)
构造函数

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

所以

如果无参数构造函数不可用(不存在或私有),则必须在子类构造函数中调用
super(…)
,提供与超类中可用构造函数匹配的参数

发件人:

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


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

听起来它试图说的是,如果你有一个类
a
和一个构造函数
a(int)
以及一个
a
的子类
B
和一个构造函数
B(int)
,那么这个构造函数会自动调用
a(int)
构造函数

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

所以

如果无参数构造函数不可用(非exi