【发布时间】:2019-02-18 09:24:12
【问题描述】:
我正在努力实现以下目标:
我有一个父类,有一些逻辑。在子类中,我“重新定义”常量/属性。有没有办法让父类中定义的方法可以访问子属性?或者更具体地说 - 在下面的示例中,有没有办法强制“out”方法编写 extended 而不是 base?
public class BaseTest {
public static final String x = "base";
public void out() {
System.out.println(x);
}
}
public class ExtendedTest extends BaseTest{
public static final String x = "extended";
}
public class Main {
public static void main(String[] args) {
BaseTest base = new BaseTest();
ExtendedTest extended = new ExtendedTest();
base.out(); // base (as expected)
extended.out(); // base (extended expected)
System.out.println(extended.x); // extended (as expected)
}
}
我主要来自 PHP 世界,这种方法工作得很好。不知道我是否遗漏了什么,或者 Java 的设计本身不允许这样做。
谢谢。
注意:无论属性是否为静态,这不重要。我只是希望能够覆盖子类中的任何类型的属性(就像我可以覆盖一个方法一样),根据我迄今为止收到的答案,这在 Java 中似乎是不可能的。在 PHP 中这是绝对可能的,这就是我问这个问题的原因。
【问题讨论】:
-
为什么那是一个静态字段呢?解决这个问题的最天真的方法是一个本地字段(不是静态的)和一个返回该字段值的抽象方法。
-
顺便说一句,您应该遵守 Java 命名约定:常量(
static final变量)应该在 UPPER_SNAKE_CASE 中。 -
Malis,术语在这里非常重要:在 Java 中,属性由 getter 和/或 setter 方法定义,而不是由 field(成员变量);某些属性甚至没有后备字段,而是在需要时进行计算。字段访问(无论是静态的还是实例的)在编译时解析,因此直接字段引用不受重新声明另一个同名字段的影响。在 Java 中为此使用了方法,句号。
标签: java inheritance