2 qq 24278327 qq_24278327 于 2014.12.06 18:03 提问

父类对象引用子类对象

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

6个回答

devmiao
devmiao   Ds   Rxr 2014.12.06 18:13

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

devmiao
devmiao   Ds   Rxr 2014.12.06 18:12

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

devmiao
devmiao   Ds   Rxr 2014.12.06 18:13

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

eagleyan
eagleyan   Rxr 2014.12.07 14:00

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

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

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

dollyn
dollyn   Rxr 2014.12.08 17:25

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

chenfs1992
chenfs1992   2014.12.07 17:55

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

Csdn user default icon
上传中...
上传图片
插入图片