如下代码:
public class TestOverride {
public static void main(String[] args) {
Super s = new Sub();
System.out.println(s.set());
System.out.println(s.a);
}
}class Super {
public int a = 10;
public int set(){
return a;
}
}
class Sub extends Super {
public int a = 20;
public int set(){
return a;
}
}运行后输出:
20
10
为什么不都是20?
我想不明白了。

解决方案 »

  1.   

    子类覆盖了父类的set方法,所以System.out.println(s.set());调用子类的。s.a访问的是父类的属性。
      

  2.   

    Java的多态好像是体现在方法上的.首先父类和子类都有着共同的方法,当一个父类的引用变量(s)指向一个子类的对像(new Sub()),这个s只能访问它本身类(Super)的方法,而它指向子类对像,在调用方法的时候如果子类有着同样的方法(传说中的方法覆盖),它会调用子类的方法所以会是20.而方法属性时它不会访问子类的属性(所以我猜多态性可能体现在方法上<呵呵,"不同的表现",应该就是它了>).与之形成比较就是了这样了 Super s = new Super();==>引用它本身的对像
      

  3.   

    每一个子类对象内部都有一个父类对象(从子类构造器调用父类构造器可以看出来),当用父类引用指向子类对象的时候(Super s = new Sub()),我们通过父类引用s只能看到对象中父类的内容(相当于从父亲的角度看),所以s.a访问的是父类中的a。可以通过强制类型转换来看到子类中的内容,如果在你的程序中添加:Sub ss=(Sub) s; ,那么当你利用ss访问成员变量的时候就会访问子类的成员变量,如;ss.a==20
        上面所说的只适用于成员变量,因为java支持多态,即如果父类中存在的方法在子类中被重新实现了,也就是父类规定的一件事情子类各自有各自的做法,那么将根据对象的实际类型调用方法,本题中s是Sub类对象,故调用Sub类的set方法,子类中的方法当然是访问子类中的变量(当然,如果你用super.a,那么访问的肯定是父类中的a,呵呵)
       如有纰漏,敬请指正
      

  4.   

    写java一年多了,才了解属性会有不同的表现,惭愧啊。还有补充没?