对象类型的转换

发布时间:2026/10/3 16:33:05
对象类型的转换 一、什么是对象类型转换对象类型转换发生在有继承关系的父子类之间分为两种向上转型、向下转型。注意基本数据类型转换 和 对象引用类型转换 完全不一样不要混淆。二、向上转型自动转换1. 概念子类对象赋值给父类引用变量自动完成不需要强制转换本质就是多态。 语法父类类型 引用名 new 子类类型();2. 代码示例class Animal{ public void eat(){ System.out.println(动物吃东西); } } class Dog extends Animal{ Override public void eat() { System.out.println(狗吃骨头); } //子类独有方法 public void watch(){ System.out.println(狗看家); } } public class UpDemo { public static void main(String[] args) { //向上转型子类对象给父类引用 Animal an new Dog(); an.eat(); //执行子类重写的eat方法 //an.watch(); //报错向上转型之后无法访问子类独有的方法 } }输出狗吃骨头3. 特点总结自动转换安全不会抛出异常可以调用父类拥有的方法如果子类重写执行子类方法不能访问子类独有的成员与方法使用场景方法参数、返回值实现多态提升扩展性。三、向下转型强制转换1. 概念已经向上转型后的父类引用强制转回子类类型目的是调用子类独有的方法。 语法子类类型 引用名 (子类类型) 父类引用变量;2. 代码演示public class DownDemo { public static void main(String[] args) { //向上转型 Animal an new Dog(); //向下强制转型 Dog dog (Dog) an; dog.eat(); dog.watch(); //此时可以调用子类独有的watch方法 } }输出狗吃骨头 狗看家3. 向下转型的风险如果父类引用实际指向的对象并不是强制转换的子类运行时抛出ClassCastException类型转换异常。错误示范class Cat extends Animal{} public class ErrorDemo { public static void main(String[] args) { Animal an new Cat(); Dog dog (Dog) an; //编译不报错运行抛出ClassCastException } }编译只看左边引用类型不看真实对象错误只会在运行的时候暴露所以向下转型必须做校验。四、instanceof 关键字重点用来规避转型异常1. 作用判断引用变量实际指向的对象是不是某个类或者其子类的实例返回布尔值 true/false。 语法引用变量 instanceof 类名2. 标准安全向下转型模板先判断再强转开发中固定写法。public class InstanceofDemo { public static void testAnimal(Animal animal){ //判断真实对象是不是Dog if(animal instanceof Dog){ Dog dog (Dog) animal; dog.watch(); }else if(animal instanceof Cat){ Cat cat (Cat) animal; cat.catchMouse(); }else{ System.out.println(其他动物); } } public static void main(String[] args) { testAnimal(new Dog()); testAnimal(new Cat()); } }Java14 新特性模式匹配初学者了解即可if(animal instanceof Dog dog){ dog.watch(); //直接使用dog变量不用手动强转 }五、向上转型与向下转型对比表项目向上转型向下转型方向子类 → 父类父类 → 子类转换方式自动无需强转强制(子类)安全性绝对安全有风险可能ClassCastException访问权限只能访问父类方法子类独有不可访问可以访问子类全部方法使用前提继承 / 实现关系必须先向上转型配合instanceof判断本质多态为了调用子类特有功能六、常见易错点梳理没有继承关系的两个类不能做对象类型转换直接编译报错对象类型转换转换的是引用类型对象本体不会发生任何改变instanceof判断的是真实 new 出来的对象不是左边的引用类型成员变量不受多态影响转型后访问变量看引用类型不看实际对象。示例验证变量class A{ int num 10; } class B extends A{ int num 20; } public class VarTest{ public static void main(String[] args) { A a new B(); System.out.println(a.num); //向上转型输出10看引用A B b (B)a; System.out.println(b.num); //向下转型输出20看引用B } }七、本章小结向上转型子类赋值父类引用自动安全多态基础牺牲子类特有功能向下转型父类引用强制转为子类用来访问子类独有方法存在类型转换异常风险做向下转型之前务必使用instanceof做类型判断对象转换只针对引用对象本身不变无继承关系不能进行对象转换。