class Car { public void run() { System.out.println("这是父类run()方法"); } public void speed() { System.out.println("speed:0"); } } class BMW extends Car { public void special(){ System.out.println("宝马666"); } public void run() { System.out.println("这是BMW的run()方法"); } public void speed() { System.out.println("speed:80"); } } public class Benz extends Car { public void special(){ System.out.println("奔驰666"); } 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) {//父类实例作为参数 if( car instanceof Benz) { ((Benz) car).special(); return; } if(car instanceof BMW) { ((BMW) car).special(); return; } } }
试想一下,一旦有很多子类,那么这个工作量将会比没有使用向上转型大很多。这也表明向上转型还有个优点就是提高了代码的简洁性。
总结
向上类型转换(小转大):
语法规则:<父类型> <引用变量名> = new <子类型>();
1.此时通过父类引用变量调用的方法是子类覆盖或继承
父类的方法,不是父类的方法。
2.此时通过父类引用变量无法调用子类特有的方法。
3.向下转型则可以调用子类的特有方法 通过instanceof 来判断。