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);} }
- 如果没有编写构造函数,编译器会隐式地向您的类添加默认值(不带参数)。
- 如果你编写任何构造函数 – 编译器将不会添加默认构造函数。
PS:对不起我的写作。 英语不是我的母语。