【发布时间】:2018-01-26 23:02:05
【问题描述】:
我有一个抽象类,其中包含我希望我的子类初始化的变量“名称”。其中哪一个是最好的方法。
选项1.使用超类构造函数进行初始化
@Getter
abstract class A {
private final String name;
protected A(String name) {
this.name = name;
}
}
class B extends A {
private static final NAME = "Raylan";
private final int age;
public B(int age) {
super(NAME);
this.age = age;
}
}
选项 2. 使用 getter 方法。
abstract class A {
private final String name;
public abstract String getName();
}
class B extends A {
private static final NAME = "Raylan";
private final int age;
public B(int age) {
this.age = age;
}
@Override
public String getName() {
return NAME;
}
}
【问题讨论】:
-
第一个例子中
getName在哪里? -
你不能强制子类实例化一个类型。您只能强制执行方法(行为)。但不是他们应该如何实现这些方法。因此,您确实可以强制执行一些 getter 方法,例如
getFoo(),但不能强制执行实际的foo变量本身。 -
我添加了一个@Getter 注释。
-
@Zabuza 我认为
final声明会强制构造函数将值设置一次且仅一次。 -
@DavidKnipe 确实如此。如果某个东西被声明为
final,它只能设置一次。根据范围(例如成员变量),这需要在构造函数中完成,以确保变量不能再次在其他地方设置。你为什么要对我说这个,我说了什么让你感到困惑?
标签: java class inheritance