如果这些空值/变量不是通用元素,我深表歉意,我真的不确定 Java 中的术语。
我们得到了这个代码:
public class AbstrClass <T, S> {
private T value1;
protected S value2;
protected AbstrClass (T value1, S value2) {
this.value1 = value1;
this.value2 = value2;
}
public T getValue1() {
return value1;
}
public S getValue2() {
return value2;
}
}
public class Impl extends AbstrClass<String, Double> {
protected Integer value2;
public Impl (String value1, int value2) {
super("Ferdinand", (double) value2);
this.value2 = value2 + value2;
}
public void incrementValue2 (Integer value) {
super.value2 += value;
}
public static void main(String[] args) {
Impl impl = new Impl("Horst", 21);
System.out.println(impl.getValue1());
System.out.println(impl.getValue2());
impl.incrementValue2(42);
System.out.println(impl.value2);
System.out.println(impl.getValue2());
}
}
然后我们被问及如果我们运行代码/main
方法的结果是什么以及为什么。
我不确定我的推理是否正确:
- Ferdinand -> b/c 它执行一个从基础
AbstrClass
继承的方法,并且由于已经有一个值,它打印出那个值。 - 21.0 -> b/c 它执行一个继承自
AbstrClass
的方法,但其中没有值,因此它给出给定值 21,但作为 double 值,因为它在Impl
中定义为 double 值。 - 42 -> 这个我真的不明白。
- 63.0 -> 再次从
AbstrClass
执行(参见问题 2),我们从增量方法中添加 42,结果为 63。
我的推理是否正确,为什么第三个 System.out.println
结果是 42?
最佳答案
这种混淆是由一种叫做字段隐藏的东西引起的。当您在同一继承层次结构中的多个类中具有相同的字段名称时,您将拥有多个不同的字段。
所以有一个Impl.value2和一个AbstrClass.value,在Impl中调用this.value2还是super.value2是有区别的。
System.out.println(((AbstrClass<String,Double>) impl).value2);
将打印63.0
关于java - 具有通用元素的 Java 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41779824/