Java中带有泛型元素的继承

Java中带有泛型元素的继承,java,inheritance,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

很抱歉,如果这些空值/变量不是泛型元素,我真的不确定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());
}
}
公共类AbstrClass{
私人T值1;
保护价值2;
受保护的防抱死制动系统总成(T值1,S值2){
此值为1.value1=value1;
此参数为0.value2=value2;
}
公共T getValue1(){
返回值1;
}
公众价值2(){
返回值2;
}
}
公共类Impl扩展了AbstrClass{
受保护整数值2;
公共Impl(字符串值1,int值2){
超级(“费迪南德”,(双)值2);
此参数为.value2=value2+value2;
}
public void递增值2(整数值){
super.value2+=值;
}
公共静态void main(字符串[]args){
Impl Impl=新的Impl(“地垒”,21);
System.out.println(impl.getValue1());
System.out.println(impl.getValue2());
执行增量2(42);
系统输出打印项次(输入值2);
System.out.println(impl.getValue2());
}
}
然后我们被问到,如果我们运行code/the
main
方法,结果是什么,以及为什么。
我不确定我的推理是否正确:

  • Ferdinand->b/c它执行一个从基
    AbstrClass
    继承的方法,因为已经有一个值,所以它打印出该值
  • 21.0->b/c它执行一个从
    absrclass
    继承的方法,但其中没有值,因此它给出了给定的值21,但作为一个双精度值,因为它在
    Impl
    中定义为双精度值
  • 42->这个我真的不明白
  • 63.0->再次从
    absrclass
    执行此操作(参见问题2),我们从增量方法中添加42,结果是63
    我的推理正确吗?为什么第三个
    System.out.println
    的结果是42

    Impl
    的构造函数中写入:

    this.value2 = value2 + value2;
    
    对于给定输入的
    21
    value2
    的值为
    42

    impl.incrementValue2(42)
    仅影响
    super
    类中同名的变量

    System.out.println(impl.value2)
    将打印
    Impl
    的变量
    value2
    的值,该变量在构造函数中设置为
    42

    你的整体推理是好的,但不是100%正确

  • 它在打印
    value1
    的基类上调用
    getValue1
    <在父类的构造函数中将code>value1设置为作为第一个参数传入的内容。
    Impl
    的构造函数忽略其第一个参数并始终传递
    “Ferdinand”
    ,因此超级构造函数
  • 它在打印基类的
    value2
    的基类上调用
    getValue2
    Impl
    具有相同名称的变量这一事实并不重要。您对
    .0
    的推理是正确的
  • 参见答案的基础部分
  • 也许可以更精确地指定为什么超类中的
    value2
    的值发生了更改`

  • Impl
    的构造函数中写入:

    this.value2 = value2 + value2;
    
    对于给定输入的
    21
    value2
    的值为
    42

    impl.incrementValue2(42)
    仅影响
    super
    类中同名的变量

    System.out.println(impl.value2)
    将打印
    Impl
    的变量
    value2
    的值,该变量在构造函数中设置为
    42

    你的整体推理是好的,但不是100%正确

  • 它在打印
    value1
    的基类上调用
    getValue1
    <在父类的构造函数中将code>value1设置为作为第一个参数传入的内容。
    Impl
    的构造函数忽略其第一个参数并始终传递
    “Ferdinand”
    ,因此超级构造函数
  • 它在打印基类的
    value2
    的基类上调用
    getValue2
    Impl
    具有相同名称的变量这一事实并不重要。您对
    .0
    的推理是正确的
  • 参见答案的基础部分
  • 也许可以更精确地指定为什么超类中的
    value2
    的值发生了更改`

  • 这种混乱是由一种叫做场隐藏的东西引起的。如果在同一继承层次结构中的多个类中有相同的字段名,则有多个不同的字段

    因此有一个Impl.value2和一个absrclass.value,如果在Impl中调用this.value2或super.value2,则会有差异

    System.out.println(((AbstrClass<String,Double>) impl).value2);
    
    System.out.println(((AbstrClass)impl.value2);
    

    将打印
    63.0

    ,该混淆是由称为字段隐藏的内容引起的。如果在同一继承层次结构中的多个类中有相同的字段名,则有多个不同的字段

    因此有一个Impl.value2和一个absrclass.value,如果在Impl中调用this.value2或super.value2,则会有差异

    System.out.println(((AbstrClass<String,Double>) impl).value2);
    
    System.out.println(((AbstrClass)impl.value2);
    

    将打印
    63.0

    您的推理是正确的。对于第三个输出,调用
    impl.value2
    将获得在实现中声明的
    value2
    ,而不是父类的一个。这是因为与方法不同,成员字段访问不是以多态方式解析的,而是在编译时解析的。换句话说,字段访问表达式
    o.x
    将访问属于用于声明
    o
    的类型的字段
    x
    ,而不考虑运行时
    o
    的实际类型


    子类中的
    值2
    据说隐藏了父类中的值,因为它具有相同的名称。

    您的推理是正确的。对于第三个输出,调用
    impl.value2
    将获得
    value2