class SuperClass {
public String var = "I'm in SuperClass";
}
class SubClass extends SuperClass {
public String var = "I'm in SubClass";
}
public class StaticDTBDTest {
public static void main(String[] args) {
SubClass subObj = new SubClass( );
SuperClass superRef = subObj;
System.out.println(superRef.var);
}
}
我记得成员变量是在实例化对象时分配的内存空间,这里实例化了子类,为什么引用打印的是父类的成员变量值呢?

解决方案 »

  1.   

    SuperClass superRef = subObj;
    因为你向上转型了
      

  2.   

    SuperClass superRef = subObj;
    System.out.println(SuperClass.var);相当于这样
      

  3.   

    可是var没有标记是静态的呀?
      

  4.   

    我理解的成员变量是在实例化对象时分配内存空间的,这里就实例化了sub类,所以我就理解只给subclass。var分配了内存空间,。你的意思是superClass.var也分配了内存空间么?然后子类的变量没有覆盖父类的变量,虚拟机找到的最精确的变量还是父类的变量?
      

  5.   

    google 关键字 -----> java 初始化顺序
      

  6.   

    那两个var完全是两个对象,没有任何关系。
    多态体现应该这么写:
    class SuperClass {
    public String var; public SuperClass() {
    var = "I'm in SuperClass";
    }}class SubClass extends SuperClass {
    public SubClass() {
    var = "I'm in SubClass";
    }
    }public class TestStatic {
    public static void main(String[] args) {
    SubClass subObj = new SubClass();
    SuperClass superRef = subObj;
    System.out.println(superRef.var);
    }
    }
      

  7.   

    多态就是方法的迟绑定,具体的来说,就是在程序运行的时候根据对象的实际类型来调用相应的方法。通常都是用父类引用指向子类对象来实现多态的!因为它会判断子类中有没有重写此方法,如果有就先调用子类的方法,如果没有才调用父类的此方法。所以superRef.ptintMes(); 中的ptintMes方法是SubClass的方法。此打印结果是I 'm in SubClass 。
    但是多态只是针对方法的,并没有说属性,superRef的类型是SuperClass,所以访问属性的时候,访问的是自身的var。因此后面一个就打印的是I 'm in SuperClass。