你的分享就是我们的动力 ---﹥

java简单的有关问题求解

java简单的问题求解
 class X {
public void mX(){
System.out.println("Xm1");
}
}
class Y extends X{
public void mX(){
System.out.println("Xm2");
}
public void mY(){
System.out.println("Ym");
}
}
public class test{
public static void main(String[] args) {
X xRef= new Y();
Y yRef= (Y) xRef;
yRef.mY();
xRef.mX();
}
}
答案为:Ym  Xm1
我用eclipse 是 Ym Xm2(这里 因为X xRef = new Y (); 所以xRef.mX();调用的是X的子类(实例) 吧??
 Y YRef = (Y) xRef;
是什么意思呢?为什么会变成Ym 
求详细解答,谢谢

------解决思路----------------------
X xRef= new Y();//一个X类型的引用对象xRef,指向的实例对象是一个Y类型的(引用类型指向继承链下面的实例对象,无需强制类型转换)。即xRef的静态类型是X,动态类型是Y
Y yRef= (Y) xRef;//一个Y类型的引用对象yRef,指向的是xRef指向的对象(类型指向上面,需强制转换)
yRef.mY();//很显然,yRef是Y类型的,动态类型也是指向Y实例对象,调用的是Y类的mY方法
xRef.mX();//Java默认的就是动态绑定,所以调用的时候调用的是动态类型的方法,这里输出的是Xm2,因为xRef的动态类型(指向的类型)是Y,所以调用的是Y的相应的mX()方法
------解决思路----------------------
1:  Y YRef = (Y) xRef;   向下转型 ,父类的引用可以指向子类对象,只有这种情况下可以将父类引用转换成子类引用,之后就会调用子类的方法了
2:然后就是动态绑定,自己查一下
------解决思路----------------------
答案不对啊
public static void main(String[] args) {
X xRef = new Y();//在堆空间创建一个Y类型的对象,
                 //在栈空间声明一个X类型变量,指向该对象
                 //就是一个父类变量引用一个子类实例对象,这样是合法的,因为所有的Y都是X
Y yRef = (Y) xRef;//但是不能把父类的引用赋值给子类变量,需要强制转换,因为是X不一定就是Y
yRef.mY();//调用yRef对象的mY()方法,输出Ym
xRef.mX();//xRef声明的是X类型,先在X类型中查找是否有mX()方法,没有报错
          //有的话,查看xRef的实际类型,用动态绑定的方式定位到实际类型的方法签名为mX()的方法
          //输出Xm2
}