向上转型是自动安全的子类→父类转换,向下转型需强制转换且必须实际类型匹配,否则抛ClassCastException;转换不改变对象本身,只改变引用视角。

向上转型是自动的、安全的,向下转型需要强制类型转换且必须确保实际类型匹配,否则会抛出 ClassCastException。
向上转型:子类 → 父类(自动、安全)
向上转型是指把子类对象赋值给父类引用,Java 会自动完成,不需要强制类型转换。因为子类“是”父类的一种(is-a 关系),所有父类能做的事,子类对象都能做。
- 语法简单:直接赋值,如 Animal a = new Dog();
- 只能调用父类中声明的方法和字段,即使子类重写了方法,运行时仍执行子类版本(多态体现)
- 编译期检查通过,运行期不会出错
向下转型:父类 → 子类(手动、有风险)
向下转型是把父类引用转回具体子类类型,必须显式强制转换。它不总是合法——只有当该引用**实际指向的是目标子类或其子类对象**时,才能成功。
- 语法需加括号:如 Dog d = (Dog) a;
- 若 a 实际是 Cat 或 null,运行时抛出 ClassCastException
- 建议先用 instanceof 判断: if (a instanceof Dog) { Dog d = (Dog) a; }
为什么需要向下转型?
有时父类引用保存了子类对象,但后续逻辑必须调用子类特有方法(父类没定义的方法)。例如:
立即学习“Java免费学习笔记(深入)”;
- Animal a = new Dog(); —— 此时 a 不能直接调用 Dog.bark()
- 必须先向下转型:((Dog) a).bark(); 或更安全地配合 instanceof
类型转换的本质与JVM视角
Java 的类型转换不改变对象本身,只改变引用的“视角”。对象在堆中只有一个,类型信息保存在对象头中。向上转型只是放宽访问权限;向下转型则是告诉 JVM:“我确认这个对象其实是某子类,请按那个类型来解析方法表和字段。”
- 编译期检查引用类型是否兼容(如是否有继承关系)
- 运行期检查对象的实际类型(由 instanceof 或强制转换触发)
- 失败时抛异常,不是静默忽略










