Java中子类的构造函数

编译这个程序时,我得到错误 –

class Person { Person(int a) { } } class Employee extends Person { Employee(int b) { } } public class A1{ public static void main(String[] args){ } } 

错误 – 找不到构造函数Person()。 为什么定义Person()是必要的?

创建Employee您同时创建了一个Person 。 为了确保正确构造Person ,编译器在Employee构造函数中添加对super()的隐式调用:

  class Employee extends Person { Employee(int id) { super(); // implicitly added by the compiler. } } 

由于Person没有无参数构造函数,因此失败。

你可以解决它

  • 添加对super的显式调用,如下所示:

      class Employee extends Person { Employee(int id) { super(id); } } 
  • 或者向Person添加一个no-arg构造函数:

     class Person { Person() { } Person(int a) { } } 

通常,编译器也会隐式添加no-arg构造函数。 正如Binyamin Sharet在评论中指出的那样,只有在没有指定构造函数的情况下才会出现这种情况。 在您的情况下,您指定Person构造函数,因此不会创建隐式构造函数。

Employee的构造函数不知道如何构造超类Person 。 如果没有明确告诉它,它将默认尝试超类的no-args构造函数,它不存在。 因此错误。

修复是:

 class Employee extends person { public Employee(int id) { super(id); } } 

Java实际上将此代码视为:

 class Person { Person(int nm) { } } class Employee extends Person { Employee(int id) { super(); } } public class EmployeeTest1 { public static void main(String[] args){ } } 

由于没有Person()构造函数,因此失败。 而是尝试:

 class Person { Person(int nm) { } } class Employee extends Person { Employee(int id) { super(id); } } public class EmployeeTest1 { public static void main(String[] args){ } } 

Java为您提供了一个不带参数的默认构造函数。 构造函数也没有正文,所以它是这样的: public Person() {} 。 在定义自己的构造函数的那一刻,构造函数取代了默认构造函数,因此在您的情况下, Person(int nm){}取代了Person() { } 。 您的调用正在尝试隐式调用Person() { }并且由于此构造函数不再存在,因此代码失败。 请查看此前的SO问题以获取更多信息。

上面的答案是正确的,还有一些补充:你可以直接调用super(int n)来避免在这里隐式添加super():

 class Employee extends Person { Employee(int id) { super(int id);} } 
  1. 如果没有编写构造函数,编译器会隐式地向您的类添加默认值(不带参数)。
  2. 如果你编写任何构造函数 – 编译器将不会添加默认构造函数。

PS:对不起我的写作。 英语不是我的母语。