有人可以解释一下为什么你不需要覆盖Super类中定义的所有构造函数。例如:
Public Employee{
String naam;
String adres;
Employee(String name) {
this.name = name;
}
Employee(String naam, String adres) {
this(name);
this.adres =adres;
}
}
public Person extends Employee {
String name;
String adres;
Person(String name) {
this.name=name;
}
}
如果我没有覆盖第一个构造函数,则会出现编译错误。
答案 0 :(得分:3)
看看名字Hiding,你没有实现的那个不会被使用。 http://docs.oracle.com/javase/tutorial/java/IandI/override.html
答案 1 :(得分:2)
默认情况下,编译器会为每个类生成非参数构造函数,只要没有手动指定的相邻构造函数。
默认情况下,如果你没有在Person
类中指定任何构造函数,编译器将生成这个:
public Person extends Employee{
String name;
String adres;
Person(){
super(); //there is no constructor with no-arg in your parent class, therefore compilation obviously fails !
}
请注意,您的Employee
班级已禁用"非arg构造函数的默认生成,因为它提供了至少一个带有参数的构造函数和没有参数的构造函数,解释了前面生成的代码没有编译。 / p>
因此,您需要一种方法将参数name
传递给Employee
类。
唯一的方法是精确定制"定制"构造函数,意思是手动硬编码,将参数分配给父的构造函数。
这就是为什么这是正确的解决方案(不是你的):
public Person extends Employee{
Person(String name){
super(name);
}
请注意,使Person
扩展Employee
毫无意义,让Employee
扩展Person
会更合乎逻辑。
答案 2 :(得分:0)
基本上因为初始化子类时,它总是需要初始化它的超类,即调用超类的构造函数。
如果你没有通过super(...)
调用显式地调用任何超类的构造函数(如你的例子中),它将尝试隐式调用默认构造函数super()
(即没有参数)
现在在您的超类中定义了一些需要参数的自定义构造函数,这意味着不再存在默认构造函数,因此这种情况会引发编译时错误,因为您正在尝试(隐式)调用超类中不存在的(默认)构造函数。
这就是你遇到的问题:问题不在于构造函数的重写(这在概念上是错误的)。
答案 3 :(得分:0)
将此添加到Employee类定义:CUSTOM(){}
。或者,您可以尝试使用完整代码提供更明确的示例,这最终可能会产生您获得的错误。您对naam和name进行了多次引用,并在Employee类def中交换它们,这实在令人困惑
答案 4 :(得分:0)
why you dont need to override all constructors that defined in Super class
。
你不是最重要的构造函数,你所描述的并不是重写。如果您没有指定默认构造函数,编译器将创建一个默认构造函数,如果它是一个子类,它将在默认构造函数中调用默认的父构造函数super()。
您收到编译器错误,因为没有定义超类的默认构造函数
如果添加默认超类构造函数
Public Employee{
Employee(){}
.
.
}
你不会得到错误
在您的情况下,您可以通过定义
来覆盖默认构造函数Person(String name){
this.name=name;
}
在此处阅读更多http://www.javaworld.com/article/2076204/core-java/understanding-constructors.html