字段的覆盖:
public class Father { public String name="Father"; public static void main(String[] args) { Son son=new Son(); System.out.println(son.name); Father father=son; System.out.println(father.name); } } class Son extends Father{ String name="Son"; }
此时两个输出分别为:
Son
Father
所以说,字段覆盖并不会导致父类的的那个字段没作用了,当子类实例向上转型为父类实例时,通过父类实例使用字段,调用的则是父类中的字段。
不仅仅是向上转型会这样,看下面这段代码:
public class Father { public String name="Father"; public void print(){ System.out.println(name); } public static void main(String[] args) { Son son=new Son(); son.print(); } } class Son extends Father{ String name="Son"; }
根据我的理解,可以这样解释:
Son继承了Father类,所以继承了print方法,但是,通过Son的实例调用print方法其实相当于
son.super.print(); 其中super就是表示Father类的一个实例,该实例其实就是Son中的一个字段,即Father super,只不过是隐藏的而已。
当Son的实例要调用print方法时,就是用super对象再调用print方法。
也就说,其实print方法不直接属于Son类,只不过当Son没有重写print方法时,都会去调用Father实例super的print方法。
所以,super对象调用print方法所能访问到的name字段自然也只能是super对象中的name字段。。
再通俗点说,super本身就是是Son中的一个字段,那么super又怎能直接访问Son中的其他字段呢?(除非把Son中其他字段传递进super中)。。
所以,super无法访问到Son中的name字段。不过,Son中是可以访问到super中的name字段的。。不过当Son中和super中同时存在一个同名的字段时,通过Son的实例自然是优先访问Son的字段。。。如果把Son实例向上转型为Father实例,此时转型后的实例访问同名字段会变成优先访问super中的字段。
以上是我对字段覆盖的简单猜测。。。就是我自己强行解释字段覆盖为什么那样。。
方法覆盖和字段覆盖是不一样的,不论怎样(父类方法调用被覆盖方法?向上转型?)所访问到的都是被覆盖后的方法。