父类对象引用子类对象

父类引用子类对象:
Foo(){
int a=3;
}
Goo extends Foo(){
int a=4;
}
Foo f=new Goo();
f.a; 结果a=3.
不是说父类引用的是子类的对象,而子类重写了父类的成员变量。f.a应该=4.?
这是为什么呢?

因为你在派生对象里面定义的是另外一个a,不是基类的那个a。

Foo(){
protected int a=3;
}
Goo extends Foo(){
a=4;
}
Foo f=new Goo();
f.a
这样写才是3

Foo(){
protected int a=3;
}
Goo extends Foo(){
a=4;
}
Foo f=new Goo();
f.a
这样写才是4

看看bytecode你就明白了
f.a的bytecode是这样:

            : aload_1
    : getfield      #4                  // Field Foo.a:I

这个说起来很简单,两个成员其实是独立存在的

重写和重载是针对方法的,不是针对变量的,子类可以覆盖父类的变量,不能更改父类的变量。
所以Goo f = new Goo()才行。

那本书里有成员变量重写这个说法?

这不能用子类的实例变量