第一段:
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.");
}
}
两段代码不同之处在于红色部分。
第一段,方法覆盖了以后,将子类变量转换为父类就可以使用子类中的方法了。
而第二段则显示非法使用。这是什么原因?

解决方案 »

  1.   

    father是一个Test_father类型的变量,编译的时候就发现Test_father没有show这个方法,就出错了
    而第一种情况是动态绑定,所谓的父类引用指向子类对象
      

  2.   

    楼主这写的是关于重写的
       先解释下楼主的代码:
                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
      

  3.   

    楼主这写的是关于重写的
      先解释下楼主的代码:
      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