向上转型的作用

一、什么是向上转型

上转型对象不是父类创建的对象,而是子类对象的“简化”状态,它不关心子类新增的功能,只关心子类继承和重写的功能。

当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。

当使用上转型对象在调用这个方法时就可能具有多种形态。因为不同的子类在重写父类的方法时可能产生不同的行为。也就是说,不同对象的上转型对象调用同一方法可能产生不同的行为。

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.csdn.net/guchenjun789/article/details/81055317

发布了59 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/hou_shiyu/article/details/99086741