如何在Java中覆盖父构造函数?

Amp*_*een 2 java inheritance overriding super

我目前有一个类,让我们称之为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们使用更具体的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想让Employee在创建对象时打印它自己的语句,而是打印来自Person和Employee的print语句.如何覆盖此语句以防止这种情况发生?有没有更好的方法打印到控制台,以防止这种情况发生?

T.J*_*der 5

如何覆盖此语句以防止这种情况发生?

除非您可以编辑Person以提供不执行System.out.println调用的构造函数,否则您不能这样做.子类必须调用其中一个超类构造函数.¹您的Person类只有一个包含System.out.println调用的类,因此Employee别无选择,只能调用它.

这是构造函数不应该有副作用的几个原因之一.既不Person也不Employee应该打电话System.out.println.这应该留给使用类或方法(而不是构造函数)的代码.


¹如果不明确地执行此操作,编译器将super()在构造函数的开头插入.在您的情况下,这将是一个编译错误,因为Person没有零参数构造函数.