变量绑定VS方法绑定在多态

时间:2013-04-29 07:56:25

标签: java polymorphism

我观察到当我们从多态对象调用变量然后调用父变量时的行为,但是当我们调用具有相同多态对象的方法时,它会调用child的方法。为什么这是Java中多态的行为?为什么Java不以同样的方式处理多态变量和方法?

class Parent{

    int age =10;

    public void showAge(){

        System.out.println("Parent Age:"+age);
    }
}

class ChildOne extends Parent{

    int age = 20;

    public void showAge(){

        System.out.println("child one age:"+age);
    }
}

class ChildTwo extends Parent{

    int age = 30;

    public void showAge(){

        System.out.println("Child Two Age:"+age);
    }
}
public class Test{


    public static void main(String[] args) {

        Parent parentChildOne = new ChildOne();
        System.out.println("parentChildOne.age: "+parentChildOne.age);
        parentChildOne.showAge();

        Parent parentChildTwo = new ChildTwo();
        System.out.println("parentChildTwo.age: "+parentChildTwo.age);
        parentChildTwo.showAge();

    }
}

这是输出:

parentChildOne.age: 10
child one age:20
parentChildTwo.age: 10
Child Two Age:30

4 个答案:

答案 0 :(得分:1)

变量在Java中不是多态的。

相反,子类中的实例变量 shadow 实例变量在父类中具有相同的名称。 另请参阅Can parent and child class in Java have same instance variable?

答案 1 :(得分:1)

首先要记住Your variables are not polymorphic和下一个高潮的事情是你的观点

  Parent parentChildOne = new ChildOne();
  Parent parentChildTwo = new ChildTwo();

当您尝试使用Parent parentChildOne调用方法时,它应该调用子方法,因为它被覆盖并且根据多态性它应该被调用。

现在再次看到Parent parentChildOne变量的相同对象,现在这里没有多态,但jvm现在用shadowing的概念处理它所以这就是为什么它们两者都显示了他们的真实行为
请按照shadowing in java

的教程进行操作

答案 2 :(得分:0)

parentChildOneparentChildTwo属于Parent类型。因此,您正在打印age的{​​{1}}。 Parent方法也发生了同样的情况,但showAge()的值被子类隐藏了。

答案 3 :(得分:0)

请参阅评论,

class Parent{

    int age =10;

    public void showAge(){

        System.out.println("Parent Age:"+age);
    }
}

class ChildOne extends Parent{
    //when you extends Parent the inherited members are like
    //and initialized into the default constructor
    // int super.age =10; 
    int age = 20;

    public void showAge(){

        System.out.println("child one age:"+age);
    }
}

class ChildTwo extends Parent{
    //when you extends Parent the inherited members are like
    //and initialized into the default constructor
    // int super.age =10; 
    int age = 30;

    public void showAge(){

        System.out.println("Child Two Age:"+age);
    }
}
public class Test{


    public static void main(String[] args) {

        Parent parentChildOne = new ChildOne();
            // when we call like this, goes to the parent type of the variable instead of object. 
        System.out.println("parentChildOne.age: "+parentChildOne.age);
        parentChildOne.showAge();

        Parent parentChildTwo = new ChildTwo();
            // when we call like this, goes to the parent type of the variable instead of object. 
        System.out.println("parentChildTwo.age: "+parentChildTwo.age);
        parentChildTwo.showAge();

    }
}