向上转型自动安全,向下转型需强制且有风险,类型判断靠 instanceof 保障安全;向上转型是子类→父类,可自动赋值并实现多态;向下转型是父类→子类,需显式强转且依赖真实类型;instanceof 用于运行时类型检查,避免 classcastexception。

向上转型是自动的,向下转型需强制且带风险,类型判断靠 instanceof 保障安全。
向上转型:子类 → 父类,安全自动
把子类对象赋给父类类型的变量,编译器允许且不报错。本质是“用父类视角看待子类对象”,多态由此展开。
- 语法简洁:直接赋值,无需括号或关键字,例如 Animal a = new Dog();
- 能调用的方法仅限于父类声明过的(含被子类重写的方法),但无法访问子类新增方法(如 a.bark() 编译失败)
- 常见于方法参数、返回值和集合统一管理,比如 void feed(Animal animal) 可接收任意 Animal 子类实例
- 运行时实际执行哪个版本的方法,取决于 new 后的真实类型(动态绑定),不是左边声明的类型
向下转型:父类 → 子类,需强制且谨慎
把已向上转型的父类引用,还原为具体子类类型,才能调用子类特有功能。但前提是该引用确实指向目标子类对象,否则运行时报 ClassCastException。
- 语法明确:必须显式强转,例如 Dog d = (Dog) a;
- 只在确认引用真实类型时才安全;若 a 实际是 new Cat(),强转成 Dog 就会崩溃
- Java 14+ 支持模式匹配简化写法:if (a instanceof Dog dog) { dog.bark(); },一次完成判断与赋值
类型判断:用 instanceof 避免转型异常
instanceof 是运行时安全检查的核心工具,它沿继承链判断对象是否属于某类或其子类,返回 boolean 值。
- 基本用法:if (obj instanceof Dog) —— 检查 obj 是否为 Dog 类型或其子类实例
- 不能用于 null:表达式 null instanceof Dog 恒为 false,不会抛异常,但需注意逻辑边界
- 配合向下转型使用最稳妥:if (a instanceof Dog) { Dog d = (Dog) a; d.bark(); }
- 注意:静态方法不参与多态,向上转型后只能调用父类声明的静态方法;想调子类静态方法,必须向下转型后通过子类类型调用
关键细节提醒
- 转型只针对引用类型,基本类型之间用类型转换(如 (int) 3.14),与继承无关
- 两个无继承关系的类之间不能转型,编译直接报错
- 接口也适用:实现类对象可向上转型为接口类型,再用 instanceof 判断并向下转型回具体实现类
- 泛型擦除后,运行时无法获取泛型实际类型,instanceof 也不能用于带泛型的参数化类型(如 list instanceof ArrayList
不合法)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











