自从我搞乱 Java 抽象和/或接口(interface)以来已经有相当长的时间了,但我现在为了一个项目又回到了它,有些事情让我很紧张。下面是我的代码片段。
public class A {
private static String name = "None";
private static String description = "No description";
public A() {}
public A(User user) {
user.setData(this);
}
public static String getName() {
return name;
}
public static String getDescription() {
return description;
}
}
public class B extends A {
private static String name = "B";
private static String description = "This is B";
public B() {}
public B(User user) {
super(user);
}
}
public class User {
private A a;
public void setData(A a) {
this.a = a;
}
public A getData() {
return a;
}
}
当我使用 B.getName()
时我希望它返回 "B"
但它返回了 "None"
.
现在我显然做错了什么,四处搜索也没有一点帮助。我相当肯定这在某种程度上是可能的,除非我对另一种语言感到困惑。
有人可以指出我正确的方向吗?谢谢。
最佳答案
您在类 B 上调用了 getName 方法。B 没有名为 getName 的静态方法,因此它在父类(super class) A 中查找它,父类(super class) A 有。
也许您希望 B 的名称版本覆盖 A 的名称?变量不会被覆盖。 A 正在访问在 A 上定义的静态变量名称,该方法最初是在 B 上调用的并不影响。
继承和静态方法不能很好地协同工作。诸如多态性之类的 OO 概念依赖于运行时调度,static
一词应该暗示与之相反。使用多态性,程序可以在较高的抽象级别上工作,通过父类(super class)型引用对象并让子类处理细节。使用静态方法时,您必须引用要调用该方法的特定子类,因此您没有那种抽象级别。
关于Java 抽象和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37749118/