给定数据类型如何影响覆盖成员变量

时间:2017-07-27 09:29:38

标签: java oop

我已经研究了一些关于这个主题的相关帖子,我了解到当我们在子类中创建一个同名的变量时,这就是所谓的隐藏。

class A {
    int i = 10;

    public void printValue() {
        System.out.print("Value-A");
        System.out.println(i);
    }
}

class B extends A {
    int i = 12;

    public void printValue() {
        System.out.print("Value-B");
        System.out.println(i);
    }
}

public class Test {
    public static void main(String args[]) {
        A a = new B();
        a.printValue();
        System.out.print(a.i);
    }
}

当我使用class B实例化type A并打印成员数据

A a=new B();
System.out.println(a.i)//The output is `10`.(The value of parent class member data).

但是当我将class B实例化为type B时,

B a=new B();
System.out.println(a.i)//The output is 12. (The value of parent class member data)

我想知道它们有何不同。

2 个答案:

答案 0 :(得分:2)

变量绑定到引用,而不绑定到创建的对象。在您的示例中,A a = new B();此处a是对A类型绑定的变量的引用。并且,创建的对象是类型B,绑定方法。这就是它为参考变量选择值的原因。这称为数据隐藏。因为当我们在子类中创建相同的变量时,子类的变量值隐藏在super类变量下。希望它有所帮助。

答案 1 :(得分:1)

多态性仅适用于方法。变量仍然与该类型绑定。你不能改变变量。这就是您在更改类型时看到不同输出的原因。

简单来说,当你写

 A a=new B();

请记住,变量绑定到左侧,方法从右侧执行。