【Java】如何理解Java中的向上转型和向下转型

【Java】如何理解Java中的向上转型和向下转型

先说概念,在Java中,向上转型指的是:将子类对象赋值给父类引用,例如:

代码语言:javascript代码运行次数:0运行复制 Animal animal = new Dog();这种操作在Java中非常常见,比如在面向接口编程时:

代码语言:javascript代码运行次数:0运行复制 List list = new ArrayList();向上转型是由Java自动完成的(也叫自动类型提升),非常安全,但要注意,这样的父类对象不可以使用子类特有的方法

而向下转型指的是:通过强转,将父类的引用(变量)转换成子类的引用(变量),以便我们调用子类特有的方法,例如:

代码语言:javascript代码运行次数:0运行复制 Animal animal = new Dog(); // 注意这里new的是dog类型对象

Dog dog = (Dog) animal;问题来了,既然已经知道需要一个子类的dog对象了,为什么不直接new一个子类对象呢?

答案还是面向接口编程,举个例子,在Spring框架中,我们经常自动注入一个接口或抽象类:

代码语言:javascript代码运行次数:0运行复制 @Compoment

public Class example{

@Autowired

@Qualifier("dog") // 注入dog实现

private Animal animal;

public void test(){

animal.speak(); // 实际注入的是dog类

}

}

输出:汪汪汪!

​其实这样做的原因是,有时候我们不知道该使用哪种实现,有时候一个功能接口可能有多种实现,比如支付功能有微信支付和支付宝支付,为了符合面向接口编程的思想,降低耦合度,可以先统一创建一个父类对象,然后再进行强转,这样就增加了我们代码的的解耦性、扩展性和复用性。

另外,要特别注意的一点,所谓的“强制转换”,并不是把一个类型的对象转换成另一个类型的对象,只是改变了引用的类型,并没有改变对象本身的类型!

一个对象的类型在new时就已经确定了,永远不可能改变!!!

比如下面的代码会报出ClassCastException异常:

代码语言:javascript代码运行次数:0运行复制 Animal animal = new Animal();

Dog dog = (Dog) animal(); // 报错,

相关推荐