一、什么是向上转型
上转型对象不是父类创建的对象,而是子类对象的“简化”状态,它不关心子类新增的功能,只关心子类继承和重写的功能。
当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。
当使用上转型对象在调用这个方法时就可能具有多种形态。因为不同的子类在重写父类的方法时可能产生不同的行为。也就是说,不同对象的上转型对象调用同一方法可能产生不同的行为。
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();程序报错
}
}
当我们用car这个对象去调用Benz类中price这个方法时,就会报错:
这就是因为我们此处进行的向上转型,car这个对象虽然指向子类,但是子类由于进行了向上转型,就失去了使用父类中所没有的方法的“权利”,在此处就是不能调用price()这个方法。
那么向上转型到底有什么用呢,到目前为止我们不仅看不到它的好处,反而发现使用了向上转型后反而不能调用子类所特有的方法了。那么向上转型的作用到底是什么呢?
二、向上转型的作用
- 传参,当你不知道要传什么类型的参数时,可以直接将参数定义成Object类型的,这样就可以接收任意类型的参数(JAVA中所有的类都继承自java.lang.Object),但使用时要转换回来。
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();
}
}
如果此处没有向上转型,要实现show每个子类的功能,那么有几个子类就要写多少函数。
- 接口与抽象编程时使用
interface a{
aa();
}
b implements a {
aa(){}
}
c implements a {
aa(){}
}
当你不确定要实例化的是b类还是c类,但又一定要返回一个对象并且有aa方法,就可以用类似上面的做法,然后在需要对象时这样使用即可获得对象: return a a1= new b();
总结 (还是前几章里提到的)
1.在调用方法的时候,用那个引用就调用那个引用的方法,然后观察子类是否重写,若重写了就调用子类的,否则就调用父类的。
2.在对象当做参数遇到重载的时候,它会选择与它最接近的类型参数的方法匹配。通俗点说就是,找与自己类型一致的,没有找到则父类,以此类推。
3.注意子类中没有被重写的父类方法。
参考博客:https://zhidao.baidu.com/question/72034787.html
https://blog.youkuaiyun.com/guchenjun789/article/details/81055317