Java中的继承和覆盖父类构造函数

时间:2014-06-17 12:50:41

标签: java inheritance

有人可以解释一下为什么你不需要覆盖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;
    }
}

如果我没有覆盖第一个构造函数,则会出现编译错误。

5 个答案:

答案 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