前言

今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型。在此分享给大家。

向上转型

向上转型是用来表现新类和基类之间的关系。在传统中,由导出类转型成基类,在继承图中是向上移动的。因此称作向上转型。由于向上转型是从一个较专用类型向较通用类型转换,所以总是安全的。也就是说,导出类是基类的一个超集。它可能比基类含有更多的方法。但他必须具备基类中所含有的方法。
我们来看一个例子。

class Car {     public void run() {         System.out.println("这是父类run()方法");     } }  public class Benz extends Car {     public void run() {         System.out.println("这是Benz的run()方法");      }      public void price() {         System.out.println("Benz:800000$");     }      public static void main(String[] args) {         Car car = new Benz();         car.run();        //car.price();程序报错     } } 

运行后输出。这是Benz的run()方法。
但是当我们用car这个对象去调用Benz类中price这个方法时,就会报错。
这就是因为我们此处进行的向上转型,car这个对象虽然指向子类,但是子类由于进行了向上转型,就失去了使用父类中所没有的方法的“权利”,在此处就是不能调用price()这个方法。
那么向上转型到底有什么用呢,到目前为止我们不仅看不到它的好处,反而发现使用了向上转型后反而不能调用子类所特有的方法了。那么向上转型的作用到底是什么呢,我们一起来看下面的代码:

class Car {     public void run() {         System.out.println("这是父类run()方法");     }      public void speed() {         System.out.println("speed:0");     }  }  class BMW extends Car {     public void run() {         System.out.println("这是BMW的run()方法");     }      public void speed() {         System.out.println("speed:80");     } }  public class Benz extends Car {     public void run() {         System.out.println("这是Benz的run()方法");      }      public void speed() {         System.out.println("speed:100");     }      public void price() {         System.out.println("Benz:800000$");     }      public static void main(String[] args) {         show(new Benz());//向上转型实现         show(new BMW());     }      public static void show(Car car) {//父类实例作为参数         car.run();         car.speed();     } }

上面代码中