请问一个JAVA多态问题!       [关键字: 多态实现问题] 
 
请问一个JAVA多态问题! 
class SupclassTest{
int i=11;
SupclassTest(){
System.out.println("Supclass Loading....");
}
int getNum(){
return i;}
}
class Subclass extends SupclassTest
{
int i=12;
Subclass(){
System.out.println("Subclass Loading.....");
System.out.println("the method of super is "+" " +super.getNum());
}
int getNum(){
return i+12;
}
public static void main(String[] args){
Subclass sb=new Subclass();
SupclassTest sp=sb;{
System.out.println("the i of sp is "+" " +sp.i);
System.out.println("the i of sb is "+" " +sb.i);
System.out.println("the method of sp is "+" " +sp.getNum());
System.out.println("the method of sb is "+" " +sb.getNum());}
}
}
我想问一下,用子类的实例赋值给声明为父类的变量,为什么在打印时,sp.i返回的是父类中i的值11,但是在用sp.getNum()方法时,返回却是子类的getNum()方法的值24,
sp不是指向一个sb的对象吗,为什么在覆盖时,变量和方法的返回的引用结果不一样,这个多态是怎么理解,能详细解释一下内在里面的运行结构和布局,还有具体的告诉我
到底怎么运行的这个程序,谢谢!!!

解决方案 »

  1.   

    第一,因为你在子类中定义了i变量,成员变量不可以重写(如果子类定义的成员变量和父类一样则覆盖继承的变量),但是可以被继承,所以打印的是sp.i打印的是父类i的值,而方法是可以重写的,所以调用的是子类的方法
      

  2.   

    http://topic.csdn.net/u/20090724/18/92e168b8-ebb1-4626-b18b-767891ba53a1.html
      

  3.   

    猴子的毛是棕色的,金丝猴的毛是金色的,金丝猴属于猴子金色猴 A = new 金丝猴
    猴子 B = A这时候等于告诉 告诉观众笼子里面是个猴子
    OK  这时候你问观众 B的毛上面颜色,观众会根据常识回答你  棕色 (猴子的毛当然是棕的)
    你又说了,那大家拔根毛出来仔细看看吧(残忍了)    
    结果拔出来一根 发现是  金色  的。A是 金丝猴 的事实是不容忽视的哦~  从金丝猴身上拔的毛当然是金色的咯呃,扯远了~见笑
      

  4.   

    当new一个子类对象sb时,会在堆区中开辟空间,首先调用的是父类的构造方法,然后再子类的构造方法,所以在子类sb中会包含一个父类的对象,所以当你SupclassTest sp=sb时,sp只看得到sb中父类的对象,而方法只是一个函数指针,指向代码区中的方法体,在代码区会有两个 getNum()方法,但当重写后,并在new时,方法的函数指针就会指向真正的被重写的方法,所以当Subclass sb=new Subclass()后,sb中会有两个i,一个是父类的i,一个是子类的i,但是只有一个函数指针指向了被重写的getNum()方法体,所以sp.i与
    sb.i指向了不同的i,而sp.getNum()与sb.getNum()调用的是同一个方法,所以一样