[英]constructor of subclass in 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
添加一个无参数构造函数:
class Person { Person() { } Person(int a) { } }
通常,编译器也会隐式添加无参数构造函数。 然而,正如 Binyamin Sharet 在评论中指出的那样,只有在根本没有指定构造函数的情况下才会出现这种情况。 在你的情况,你已经指定了一个人的构造,因此没有隐式构造函数创建。
Employee
的构造函数不知道如何构造超类Person
。 如果没有您明确告诉它,它将默认尝试不存在的超类的无参数构造函数。 因此错误。
修复方法是:
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:对不起我的写作。 英语不是我的母语。
这不是 100% 与您的问题相关。 但这也与java构造函数有关。 假设您的 Person 类没有默认构造函数,并且构造函数参数不是原始数据类型。 它们是对象。
但是如果你想创建一个带有默认构造函数的子类,这里是解决方案。 请记住,您不得更改超类。
我创建了另一个名为 contact 的类。
class Contact{
private String name;
private int number;
public Contact(String name, int number) {
this.name = name;
this.number = number;
}
}
然后这里是代码。
//Super Class - "Can't change the code"
class Person {
Person(Contact contact) { }
}
//Sub Class
class Employee extends Person {
private static Contact c;
static {
c = new Contact("Anna",10);
}
Employee() {
super(c);
}
}
您必须使用 Contact 类的静态变量来保留对象实例以传递给超类构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.