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

关于继承的基础问题
如下代码:
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?
我想不明白了。

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

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