首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java】如何理解Java中的向上转型和向下转型

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

原创
作者头像
胖宝宝628
修改2025-07-03 07:42:49
修改2025-07-03 07:42:49
3270
举报

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

代码语言:javascript
复制
 Animal animal = new Dog();

这种操作在Java中非常常见,比如在面向接口编程时:

代码语言:javascript
复制
 List<String> list = new ArrayList();

向上转型是由Java自动完成的(也叫自动类型提升),非常安全,但要注意,这样的父类对象不可以使用子类特有的方法

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

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

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

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

代码语言:javascript
复制
 @Compoment
 public Class example{
 ​
     @Autowired
     @Qualifier("dog")                               // 注入dog实现
     private Animal animal;
 ​
     public void test(){
         animal.speak();                             // 实际注入的是dog类
     }
     
 }
 ​
 输出:汪汪汪!
 ​

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

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

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

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

代码语言:javascript
复制
 Animal animal = new Animal();
 Dog dog = (Dog) animal();       // 报错,

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档