java多态通过父类参数接收子类对象,编译时看引用类型、运行时看实际类型;子类须重写父类非private/static/final方法,向上转型隐式安全,但只能访问父类声明的成员。

Java 中多态通过父类参数接收子类对象,核心在于编译时看引用类型(父类),运行时看实际对象类型(子类)。只要子类继承父类或实现接口,就能以父类类型作为方法参数传入子类实例,调用时自动执行子类重写的方法。
方法参数声明为父类类型
定义方法时,参数类型使用父类(或接口),而非具体子类:
- 这样任何该父类的子类对象都能作为实参传入
- 编译器只检查“是否是父类的合法子类型”,不关心具体是哪个子类
void processAnimal(Animal animal) { // 参数是父类 Animal
animal.makeSound(); // 运行时调用实际对象(如 Dog/Cat)重写的 makeSound()
}
调用时可传入:processAnimal(new Dog()) 或 processAnimal(new Cat()),无需修改方法签名。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
子类必须正确重写父类方法
多态行为生效的前提是:子类对父类中被调用的方法做了 @Override(非 private / static / final 方法):
- 父类方法需是 非私有、可继承、可覆盖 的(如 public/protected 的实例方法)
- 子类用
@Override明确重写,确保方法签名一致(名称、参数、返回类型协变) - 若子类没重写,就执行父类原方法;若重写了,运行时动态绑定到子类版本
向上转型是隐式且安全的
把子类对象赋给父类引用(即“向上转型”),Java 自动完成,无需强制转换:
-
Animal a = new Dog();合法 —— Dog 是 Animal 的子类 - 这种转型天然支持多态:后续调用
a.makeSound()就走 Dog 的实现 - 方法参数接收本质上就是一次隐式向上转型
注意不能反向调用子类特有成员
用父类参数接收子类后,只能访问父类中声明的成员(方法和字段):
- 如果 Dog 有独有方法
fetchBall(),而参数是Animal animal,则animal.fetchBall()编译报错 - 如真需要调用子类特有功能,应先判断类型(
instanceof)再向下转型,但会破坏多态设计初衷,一般应通过扩展父类或接口来解决
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










