抽象类 - 超级构造函数(Java)

pav*_*163 5 java class abstract

我有一个非常简单的问题:

假设我有一个代表一个人在酒吧里的抽象类.

public class Person {
    protected String firstName;
    protected String lastName;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有2个课程可以扩展Person,让我们说一个调酒师课程和一个客户课程.

在客户的课堂上,我也想要一个代表他的年龄的int作为一个领域.在调酒师课上,我们没有.

另外,对于客户类,我想要一个方法isAdult().

public class Bartender extends Person {
    public Bartender(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

public class Customer extends Person {
private int age;    

    public Customer(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在有两个问题:

1)这不起作用,因为我收到消息"隐式超级构造函数Passenger()未定义.必须显式调用另一个构造函数".这到底是什么意思?2)对于方法isAdult(),我觉得最好的方法是在抽象类Person中实现它,如下所示:

public abstract boolean isAdult();
Run Code Online (Sandbox Code Playgroud)

然后实施它,让Bartenders一直回归真实,并让客户检查他们的年龄.

另一种方法是直接从Person类实现它,如下所示:

public boolean isAdult() {
    return (this instanceof Bartender || age > 18);
}
Run Code Online (Sandbox Code Playgroud)

这会起作用,哪种方式会更好?

Hov*_*els 6

Person有一个使用构造函数定义的参数,没有默认的无参数构造函数.由于必须始终在子构造函数中调用子类的超级构造函数,并且由于Person没有默认构造函数,因此必须在子构造函数中显式调用它:

public Bartender(String firstName, String lastName) {
    super(firstName, lastName);

    // don't do this:
    // this.firstName = firstName;
    // this.lastName = lastName;
}
Run Code Online (Sandbox Code Playgroud)

public Customer(String firstName, String lastName, int age) {
    super(firstName, lastName);
    this.age = age;
}
Run Code Online (Sandbox Code Playgroud)

关于isAdult(),您可以在Customer类中使用此方法,而不是在Bartender中使用它.或者,如果超级必须有这种方法,如果有人在调酒师上调用它,你可以抛出异常,因为不应该这样调用它.