单个对象如何为同一字段显示不同的值(继承)

时间:2015-09-17 19:01:13

标签: java inheritance polymorphism

请考虑以下代码。

class Base {
    int i = 99;

    public void amethod() {
        System.out.println("Base.amethod()");
    }

    Base() {
        this.amethod();
    }
}

public class Derived extends Base {
    int i = -1;                                      
    public static void main(String argv[]) {
        Derived  b;                       // here if we use **Base b;** below mentioned println() prints 99 
        b = new Derived();                
        System.out.println(b.i);                   
        b.amethod();
    }

    public void amethod() {
        System.out.println("Derived.amethod()");
    }
} 

输出

Derived.amethod()
-1              (99 when reference variable is of Base type)
Derived.amethod()

现在我的问题是

由于我只使用一个'new'关键字,因此只会创建一个对象(这将是Derived和基类的实例),此对象将具有名为i的单个实例变量,其值应相同(我认为)是否使用Base类ref var或Derived class ref var引用它。如何通过更改引用变量声明(从Derived到Base)来改变这个i的值,因为我没有更改堆中的任何对象获取的内容存储。

希望我明白我的问题。

2 个答案:

答案 0 :(得分:3)

有一个对象,是的,但它有两个名为i的成员。基本上Derived中的那个会影响Base中的那个。成员访问权限不是多态的 - 它指的是与指向对象的引用相关的类型的确切成员。

答案 1 :(得分:1)

当您实例化Derived时,您实际上会有两个名为' i'的类字段。但是,一个将Base.i,另一个Derived.i派生字段将隐藏基本字段,除非您看到,您的派生被视为基础