提要:

转型是在有继承关系时才会发生的;

向下转型的前提是已经发生了向上转型;

向下转型需要用到强制类型转换;

向上转型:

向上转型是指: 当父类的对象用子类的构造方法进行实例化。

向上转型很容易达到,并且该对象可以使用父类的所有方法,如果子类将父类的方法进行重写,那么调用的就是子类重写后的构造方法

public class Main {
    public static void main(String[] args) {
    Fruit fruit = new Apple();
    fruit.show();
	//fruit.test();       //这里会报错,因为对象不能调用子类自己的构造方法
    }
}
class Fruit{
    public void show(){
        System.out.println("I'm Fruit!");
    }
}
class Apple extends Fruit{
    @Override
    public void show() {
        System.out.println("I'm apple!");
    }
    public void test(){
        System.out.println("我是苹果");
    }
}

运行结果:

E:\jdk\bin\java.exe "-javaagent:E:\JAVA\IntelliJ IDEA 2023.1.2\lib\idea_rt.jar=61466:E:\JAVA\IntelliJ IDEA 2023.1.2\bin" -Dfile.encoding=UTF-8 -classpath H:\APEsource\IDEA\exercise\day23.12\day23.12.3\target\classes org.example.Main
I'm apple!

进程已结束,退出代码0

向上转型使用场景

向上转型的一个典型应用场景是在多态的情况下使用。多态是指在程序运行时,一个对象具有多种不同的形态。通过向上转型,可以将不同子类的实例赋值给父类类型的变量,然后通过父类类型的变量来调用相应的方法,实现不同子类的特定行为。

向下转型:

向下转型使用场景

向下转型的主要作用是在向上转型后,需要再次使用子类特有的属性和方法时进行。由于向上转型后,父类类型的变量无法直接调用子类特有的属性和方法,所以需要先将父类类型的变量转换为子类类型的变量,再调用子类特有的属性和方法。

Fruit fruit = new Apple();
    Apple apple = (Apple) fruit;

上述代码很容易实现,因为fruit引用的对象本就是Apple对象向上转型所得到的,在对fruit向下转型后,得到的还是Apple对象

注意:

当然,这里也容易报错ClassCastException,这是由于向下转型不正确导致的,就像你可以说苹果apple1是水果,说水果apple1是苹果,这是正确的,但不能说水果apple1是橘子,这就错了。

总结:

向上转型:自动转型,父类引用子类对象。for调父类方法。

向下转型:强制类型转换,本质上就是子类已经发生了向上转型,再次转回来而已。for调父类中没有的子类方法。