class exam{
    public static void main(String[] args){
         Y v2=new Y();
  X v3=(X)v2;
         System.out.println(v3.x);
         System.out.println(v3.retv());
    }
}
class X{
    int x=10;
    int retv(){
       return x;
    }
}
class Y extends X{
    int y=20; 
    int x=30;
    int retv(){
         return x;
    }
}
----------------------------------------------
输出结果:
10
30
为什么是这个结果?
怎么不是30  30 啊?

解决方案 »

  1.   

    JVM里每个类都有自己的类存储形式,在类加载的时候已经固定了的。
    jvm处理的时候,每个类都有自己的常量池。呵呵。就是这么一回事情而已。 而方法也有方法存放的表,子类重载是覆盖父类方法的话,该方法在该表中还是原先位置,只是把引用空间指向了新得函数体而已。
      

  2.   

    v3.x  v3类型是X,所以是X.x
    v2.x  v2类型是Y,所以是Y.x     (JVM中指令为getfield)v3.retv()   //根据v3的真实类型调用方法,也就new 对象类型()时的“对象类型”,也就Y;
                (JVM中指令为invokevirtual)
      

  3.   

    试试这个没?
    class exam{
        public static void main(String[] args){
             Y v2=new Y();
           X v3=(X)v2;
             System.out.println(v3.retv());
             System.out.println(v3.x);    }
    }
    class X{
        int x=10;
        int retv(){
           return x;
        }
    }
    class Y extends X{
        int y=20;     int retv(){
            x=30;
             return x;
        }
    }
    输出结果:
    30
    30
      

  4.   

    free_card(痛并快乐着) 讲得很清楚啊!成员变量不支持重载,而方法可以!
    这个例子好像在thinking in java上面讲过!
      

  5.   

    成员变量不支持重载?
    Why the result is (30,30) in my case?
      

  6.   

    这个不是什么重载吧,你只是把父类的x拿来
      重新给它赋值了啊,如果你不调用子类的retv()方法,x的值肯定还是10啊
     在你第一个例子中,子类中的x有自己的定义啊,
     和父类中的x是两个不同的变量啊,当然不能重载了哦,它们应该有不同的内存地址的啊
      

  7.   

    v3.x指向父类的x地址,v3.retv()指向子类的函数地址并且返回子类的变量,
    可以把类Y里面的变量x改称其他名字来考虑
      

  8.   

    class exam{
        public static void main(String[] args){
             Y v2=new Y();
      X v3=(X)v2;
             System.out.println(v3.x);
             System.out.println(v3.retvxx());
        }
    }
    class X{
        int x=10;
        int retv(){
           return x;
        }
    }
    class Y extends X{
        int y=20; 
        int x=30;
        int retvxx(){
             return x;
        }
    }试一试 你就什么都明白了
      

  9.   

    v3.x指向父类的x地址,v3.retv()指向子类的函数地址并且返回子类的变量