你如何覆盖 Java 中的父构造函数?
How do you override the parent constructor in Java?
我目前有一个 class,我们称它为 Person,具有这样的构造函数。
public class Person
{
private String name;
public Person(String name)
{
this.name = name;
System.out.println("This person is: "+getName());
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
}
然后我们继承 class 具有更具体类型的 Person,在本例中为 Employee。
public class Employee extends Person
{
private int id;
public Employee(String name, int id)
{
super(name);
this.id = id;
System.out.println("This person is: "+getName()+", identified by #"+getId());
}
public int getId()
{
return this.name;
}
public void setId(int id)
{
this.id = id;
}
}
我想让 Employee 在创建对象时打印它自己的语句,而是打印来自 Person 和 Employee 的打印语句。我如何覆盖此声明以防止这种情况发生?有没有更好的方法打印到控制台来防止这种情况发生?
How can I override this statement to keep that from happening?
您不能,除非您可以编辑 Person
以提供不执行 System.out.println
调用的构造函数。 subclass 必须 调用其 superclass 构造函数之一。¹您的 Person
class 只有一个,其中包括System.out.println
调用,Employee
只好调用
这是构造函数不应有副作用的几个原因之一。 Person
和 Employee
都不应该调用 System.out.println
。这应该留给使用 class 或方法(而不是构造函数)的代码。
¹ 如果您不显式执行此操作,编译器将在构造函数的开头插入 super()
。在您的情况下,这将是一个编译错误,因为 Person
没有零参数构造函数。
当您调用 super
时,将调用父级的构造函数。无法避免:这就是 super
的目的。
如果你想在对象创建时调用不同的 println
一次,你将不得不将 println
放在构造函数之外。一个好的选择是使用构建器或工厂模式,覆盖 Person
和 Employee
类 中的 toString
,然后从构建器或工厂调用 toString
.
由于您定义了自己的 Person 构造函数,因此 class 没有可用的无参数构造函数供您使用。但是如果你把它加回来,那么你可以让一个 subclass 有它自己的行为
public class Person {
protected String name;
public Person() {}
public Person(String name) {
this.name = name;
System.out.println("This person is: "+getName());
}
然后就不用自己添加超级调用了
public class Employee extends Person {
private int id;
public Employee(String name, int id) {
this.name = name;
this.id = id;
System.out.println("This person is: "+getName()+", identified by #"+getId());
}
我目前有一个 class,我们称它为 Person,具有这样的构造函数。
public class Person
{
private String name;
public Person(String name)
{
this.name = name;
System.out.println("This person is: "+getName());
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
}
然后我们继承 class 具有更具体类型的 Person,在本例中为 Employee。
public class Employee extends Person
{
private int id;
public Employee(String name, int id)
{
super(name);
this.id = id;
System.out.println("This person is: "+getName()+", identified by #"+getId());
}
public int getId()
{
return this.name;
}
public void setId(int id)
{
this.id = id;
}
}
我想让 Employee 在创建对象时打印它自己的语句,而是打印来自 Person 和 Employee 的打印语句。我如何覆盖此声明以防止这种情况发生?有没有更好的方法打印到控制台来防止这种情况发生?
How can I override this statement to keep that from happening?
您不能,除非您可以编辑 Person
以提供不执行 System.out.println
调用的构造函数。 subclass 必须 调用其 superclass 构造函数之一。¹您的 Person
class 只有一个,其中包括System.out.println
调用,Employee
只好调用
这是构造函数不应有副作用的几个原因之一。 Person
和 Employee
都不应该调用 System.out.println
。这应该留给使用 class 或方法(而不是构造函数)的代码。
¹ 如果您不显式执行此操作,编译器将在构造函数的开头插入 super()
。在您的情况下,这将是一个编译错误,因为 Person
没有零参数构造函数。
当您调用 super
时,将调用父级的构造函数。无法避免:这就是 super
的目的。
如果你想在对象创建时调用不同的 println
一次,你将不得不将 println
放在构造函数之外。一个好的选择是使用构建器或工厂模式,覆盖 Person
和 Employee
类 中的 toString
,然后从构建器或工厂调用 toString
.
由于您定义了自己的 Person 构造函数,因此 class 没有可用的无参数构造函数供您使用。但是如果你把它加回来,那么你可以让一个 subclass 有它自己的行为
public class Person {
protected String name;
public Person() {}
public Person(String name) {
this.name = name;
System.out.println("This person is: "+getName());
}
然后就不用自己添加超级调用了
public class Employee extends Person {
private int id;
public Employee(String name, int id) {
this.name = name;
this.id = id;
System.out.println("This person is: "+getName()+", identified by #"+getId());
}