为什么被覆盖的方法没有表现出多态行为?

时间:2017-11-19 15:32:44

标签: java inheritance polymorphism

我知道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>

3 个答案:

答案 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覆盖。