java - 具有通用元素的 Java 继承

标签 java inheritance

如果这些空值/变量不是通用元素,我深表歉意,我真的不确定 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 方法的结果是什么以及为什么。
我不确定我的推理是否正确:

  1. Ferdinand -> b/c 它执行一个从基础 AbstrClass 继承的方法,并且由于已经有一个值,它打印出那个值。
  2. 21.0 -> b/c 它执行一个继承自 AbstrClass 的方法,但其中没有值,因此它给出给定值 21,但作为 double 值,因为它在 Impl 中定义为 double 值。
  3. 42 -> 这个我真的不明白。
  4. 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/

相关文章:

java - 自定义表单验证注释不起作用

java - tomcat 7访问映射驱动器

java - 在java中单行编辑文件

c++ - 我应该如何在 C++ 中表示继承对象树?

java - 组合与继承?

inheritance - VB6在子类中访问父类的重载接口(interface)子程序

c# - LINQ to SQL,从继承类中选择

java - SQL 错误 : Closed Connection in java

javascript - 使用 $.extend() 进行原型(prototype)继承?

java - 如何使原子成为 ConcurrentHashMaps 上的嵌套迭代操作?