我知道Variables doesn't exhibit polymorphic behavior并且它仅限于方法。但是下面的代码在返回对象类型时有点混乱。
它调用子方法(这是正确的),这意味着它正在返回子对象。那么为什么不打印子变量的值呢?
class Parent {
int var = 11;
public Parent getInstance() {
System.out.println("In Parent ...");
return new Parent();
}
}
class Child extends Parent {
int var = 22;
public Child getInstance() {
System.out.println("In Child ...");
return new Child();
}
}
public class VariableHiding {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.getInstance().var); // something's fishy?
}
}
// Output : In Child ... 11
PS:它不是this one的副本(它讨论了不参与多态的变量,但这里提到的变量返回了子obj的对象,并且obj持有父变量而不是它自己的变量)< / p>
答案 0 :(得分:1)
运行时多态性。因此,sampleMethod
都有一个公共变量class Parent and Child
。
var
在Parent p = new Child();
中,由p
引用(类型为Parent类)。因此它总是引用超类变量。
答案 1 :(得分:0)
always @(posedge clk) begin
A_reg<=A
B_reg<=B
end
的返回类型为p.getInstance()
,因为Parent
的编译时类型为p
,而Parent
方法为getInstance()
会返回Parent
。
你可以看到,如果你试着写:
Parent
没有通过编译。
因此Parent p = new Child();
Child c = p.getInstance();
返回p.getInstance().var
类的实例变量。
为了获取Parent
类的实例变量,您必须将Child
投射到p.getInstance()
:
Child
或将System.out.println(((Child)p.getInstance()).var);
的类型更改为p
:
Child
答案 2 :(得分:0)
输出为11而不是22,因为行
Parent p=new Child();
已被声明为对Parent的引用,而不是对Child的引用。这是合法的(Child是父级)但是从变量 var 的角度来看,即使将对象构造为Child也被视为父对象,因此不会考虑在Child中写入的值。登记/> 如果变量var在costructors中定义,则以下列方式
,故事将完全不同 class Parent {
protected int var;
Parent(){ var=11;}
public Parent getInstance() {
System.out.println("In Parent ...");
return new Parent();
}
}
class Child extends Parent {
Child(){ var=22;}
public Child getInstance() {
System.out.println("In Child ...");
return new Child();
}
}
这次使用相同的main函数,结果是22,如所期望的那样,因为在Parent的costuctor中定义的值11被Child的一个中定义的值22覆盖。