2014-06-17 89 views
-3

有人可以解释为什么你不需要重写Super类中定义的所有构造函数。例如:在Java中的继承和重写父类的构造函数

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

您的构造函数需要一个参数:'name'。在Java中,只有非参数构造函数是由defaut生成的。 – Mik378

+0

如何重写构造函数????? – anirban

回答

0

基本上,因为当一个子类被初始化时,它总是也需要初始化它的超类,即调用超类的构造函数。

如果您没有通过super(...)调用显式地调用超类的构造函数(如您的示例中所示),它将尝试隐式调用默认构造函数super()(即不带参数)。

现在在你的超类中你定义了一些需要参数的自定义构造函数,这意味着没有更多的默认构造函数,因此这种情况会引发编译时错误,因为你试图(隐式地)调用(默认)构造函数,它不在超类中。

这是你的问题:这个问题不是关于构造函数的重写(这是一个概念在概念上是错误的)。

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类“禁用”默认代无参构造函数因为它提供了至少一个构造函数,参数为,而NO构造函数不带参数,说明前面生成的代码不能编译。

因此,您需要一种方法将参数name传递给Employee类。 要做到这一点的唯一方法是精确的“自定义”构造函数,意味着手动硬编码,将调度参数到父项的构造函数。

这就是为什么这是正确的解决方案(不是你的):

public Person extends Employee{ 
    Person(String name){ 
    super(name); 
    } 

注意,使Person延伸出的Employee是没有意义的,它会更合乎逻辑的有Employee延伸Person

0

将此添加到Employee类定义:CUSTOM(){}。或者,您可以尝试使用完整的代码给出更明确的示例,最终可能会产生您正在获取的错误。你对naam和name进行了几次引用,并在Employee类def中进行了交换,这真是令人困惑。

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