class SuperClass{
int a=5,b=8,c=85;
void show(){
  System.out.println("a*b="+(a*b));
}
}
class SubClass extends SuperClass{
int b=26,d=32;
void show() {
  System.out.println("b+d="+(b+d));
}
}
public class ClassExchangeDemo{
public static void main(String args[]){
SuperClass super1;                             //声明基类对象
SubClass sub1;                                      //声明子类对象
sub1=new SubClass();
super1=sub1;                               //子类对象转换为基类对象
System.out.println("super1.a="+super1.a+"\tsuper1.b="+super1.b+"\tsuper1.c="+super1.c);
System.out.println("super1.show():\t");
super1.show();
}
}
打印结果:
super1.a=5 super1.b=8 super1.c=85
super1.show():
b+d=58请问:为何super1=sub1以后,super1中的a,b,c还是原来的父类中的值,show()方法为何就是子类中的方法呢?

解决方案 »

  1.   

    a,b,c没有覆盖,而show()覆盖了啊
      

  2.   

    superl =sub.这个就是向上转型.相当于SuperClass super1= new new SubClass();调用的是子类中的方法是因为子类覆盖了父类的show()方法,而初始化字段,是没有覆盖这一说的,它们虽然名字一样,可是是完全不相干的.子类中定义的2个变量,你可以改成其他名字,结果也是一样的!
      

  3.   

    这个问题很简单,因为java是动态编译的语言,对方法是进行动态绑定的根据this指针找到那个要调用的方法,而属性是静态编译的为了安全要初始化,多态是由java的反射机制实现的
      

  4.   

    你的问题不是类型转换的问题,没有理解JAVA里面那些是动态的,那些是静态的。
      

  5.   

    Java并没有规定对象的内存表达,所有从内存方面所找到的答案都是针对某个
    特定的JVM的,所以都不是完整的。Java语言本身对这个问题有明确的定义:
    在继承关系中,对于同名的成员:
    1. 子类实例方法可以override 或overload父类实例方法
    2. 子类类方法可以hide父类类方法
    3. 子类field可以hide父类field.
    多态性仅体现在override上。在对field的存取上,用的类型是引用变量的
    类型,因此虽然super1引用的是子类对象,但super1的类型却是SuperClass,
    super1.b当然就是SuperClass中的b了.
      

  6.   

    to flight2003() 想了解jvm去看一下那本 深入java虚拟机吧?