日期:2014-05-20  浏览次数:20804 次

子类变量转换为父类问题
第一段:
public class Test_Super {
  public static void main(String [] args){  
Test_father father=new Test_father();
  Test_son son=new Test_son();
   
   
  father=son;
  father.display();
   
}
}
class Test_father{
public void display(){
System.out.println("This is father.");
}
}
class Test_son extends Test_father{
public void display(){
System.out.println("This is son.");
}
}

第二段:
public class Test_Super {
  public static void main(String [] args){  
Test_father father=new Test_father();
  Test_son son=new Test_son();
   
   
  father=son;
  father.show();
   
}
}
class Test_father{
public void display(){
System.out.println("This is father.");
}
}
class Test_son extends Test_father{
public void show(){
System.out.println("This is son.");
}
}
两段代码不同之处在于红色部分。
第一段,方法覆盖了以后,将子类变量转换为父类就可以使用子类中的方法了。
而第二段则显示非法使用。这是什么原因?

------解决方案--------------------
father是一个Test_father类型的变量,编译的时候就发现Test_father没有show这个方法,就出错了
而第一种情况是动态绑定,所谓的父类引用指向子类对象
------解决方案--------------------
楼主这写的是关于重写的
先解释下楼主的代码:
Test_father father=new Test_father();
Test_son son=new Test_son();
father=son
楼主这三行代码可以这样写:
Test_father father = new Test_son();
第一段之所以成功是因为子类覆盖了父类的 display() 方法
所以当调用 display() 方法时 调用的是子类中的display() 方法;
第二段并没有覆盖,当由父类声明的变量再去调用时,找不到那个方法,所以会报错!
有关重写和重载的具体说明楼主可以去这看看:
http://blog.csdn.net/ningxuezhu/article/details/7486315