JAVA类的向下转型与向上转型

学习笔记一:JAVA向上和向下转型

向上转型

子类对象转换为父类:father f = new son();
father时父类或者接口,son是子类。
主要是用在父类的方法被重写之后,系统会自动根据他的实例类进行判断,执行实例类的重写之后的函数。
例如:

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();
    }
}

在上面的代码块中

 public static void main(String[] args) {
        show(new Benz());
        show(new BMW());
    }

    public static void show(Car car) {
        car.run();
        car.speed();
    }

这个时候按照car的实例类Benz和BMW,在这两个子类之中执行他们重写的父类的方法。
那如果没有向上转型结果将会是这样:

 public static void main(String[] args) {
        show(new Benz());
        show(new BMW());
    }

    public static void show(Benz benz) {
        benz.run();
        benz.speed();
    }
    public static void show(BMW bmw) {
        bmw.run();
        bmw.speed();
    }

这个时候如果多一个子类,那么就会多一种重载的show方法,因为此时的子类数量还不够多,所以节约的代码量不是很大,但是当有几百上千种子类时,那时候节约的代码量将会是海量的,所以合理的使用向上转型将会减少很多的代码量。

注意:向上转型之后只能调用子类重写的父类的方法,而无法调用子类之中有,而父类种却没有的方法(即无法调用子类中特有的方法),为了解决这个问题,我们于是有了与之对应的向下转型的概念。


向下转型

父类对象转化为子类对象:Son s = (Son) f;
有的向下转型是安全的:
Father father = new Son();
Son son = (Son)father;
有的向下转型是不安全的:
Father father = new Father();
Son son = (Son)father;

所以向下转型过程中要注意的是:

情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。


最后总结一下:

  • 如果是向上转型(father f = new son();),那么是只能调用 1.父类的函数 和 2.子类重写的父类的函数,同时该实例化的对象也是无法访问子类中的属性的,只有在子类中的方法是可以访问父类的属性的。
  • 向上转型可以很好的减少代码的重复,刚开始以父类为参数,调用函数时,以子类为参数进行函数的调用。
  • 向上转型后,子类特有的方法时无法调用的,子类的特有的属性同样无法调用。
  • 向下转型之后可以调用子类的特有的方法和属性,并且转型之后的引用和转型之前的引用指向的时同一个对象,两个引用的改变都会影响该对象。

猜你喜欢

转载自blog.csdn.net/weixin_43938560/article/details/88708921