重新精读《Java 编程思想》系列之向上转型与向下转型
前言
今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型。在此分享给大家。
向上转型
向上转型是用来表现新类和基类之间的关系。在传统中,由导出类转型成基类,在继承图中是向上移动的。因此称作向上转型。由于向上转型是从一个较专用类型向较通用类型转换,所以总是安全的。也就是说,导出类是基类的一个超集。它可能比基类含有更多的方法。但他必须具备基类中所含有的方法。
我们来看一个例子。
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(); } }
上面代码中