日期:2014-05-20  浏览次数:20728 次

一个java继承关系的域访问问题
最近在看think in java,颇感收益良多。
遇到里面有这么一段代码,有些不解,忘大神为小弟解惑。
class Super {
public int field = 0;
public int getField(){ return field;}
}

class Sub extends Super {
public int field  = 1;
public int getField(){ return field;}
public int getSuperField(){ return super.field;}
}

public class FieldAccess {
public static void main(String[] args){
Super sup = new Sub();
System.out.println("sup.field = " + sup.field +" ,sup.getField() = " + sup.getField());
Sub sub = new Sub();
System.out.println("sub.field = " + sub.field + " ,sub.getField() = " + sub.getField() +" ,sub.getSuperField() = " + sub.getSuperField());
}
}
为什么输出的结果是
0,1
1,1,0
我原先的理解第一行应该是1,1
但我运行后发现结果却是为0,1,不知道为什么

------解决方案--------------------
Super sup = new Sub();
很显然 你用的是父类创建的一个对象呀。

------解决方案--------------------
Super sup = new Sub();

这句,你的sup是Super,所以,sup.field是在Super类里找这个属性值,应该为0;sup.getField()这个方法,被你声明的那个子类Sub重写了,所以得到的是重写好的值,也就是这sup.getField得到的是1(也可以说获取了Sub的field值)
------解决方案--------------------
引用:
Super sup = new Sub();

这句,你的sup是Super,所以,sup.field是在Super类里找这个属性值,应该为0;sup.getField()这个方法,被你声明的那个子类Sub重写了,所以得到的是重写好的值,也就是这sup.getField得到的是1(也可以说获取了Sub的field值)
恩  这个很详细
------解决方案--------------------
引用:
好像有点明白了,是不是这么个意思,父类Super和子类Sub对象均有一个叫做field的属性(这里的名字相同而已),而通过继承关系,子类覆盖了父类的getField()方法。所以sup.field还是访问的父类的属性,而sup.getField()访问的是子类的覆盖之后的方法。


覆盖字段的话 需要用属性来覆盖。