Java中带有泛型元素的继承
很抱歉,如果这些空值/变量不是泛型元素,我真的不确定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
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/themain
方法,结果是什么,以及为什么。我不确定我的推理是否正确:
AbstrClass
继承的方法,因为已经有一个值,所以它打印出该值李>
absrclass
继承的方法,但其中没有值,因此它给出了给定的值21,但作为一个双精度值,因为它在Impl
中定义为双精度值李>
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