多态 向上转型
Collection<String> list = new ArrayList<>();
(1) 编译时类型 vs 运行时类型
- 编译时类型(引用类型):
Collection<String>
- Java 编译器 只允许你调用
Collection
接口中定义的方法。 - 如果尝试调用
ArrayList
特有的方法(如getFirst()
、removeFirst()
),编译器会报错。
- Java 编译器 只允许你调用
- 运行时类型(实际对象):
ArrayList<String>
- 虽然底层实际是
ArrayList
,但 编译器不允许你直接访问其特有方法,因为引用类型是Collection
。
- 虽然底层实际是
(2) 多态的核心规则
- Java 的多态机制遵循 “编译看左边,运行看右边” 的原则:
- 编译时:检查引用类型(左边),决定可用方法。
- 运行时:调用实际对象(右边)的方法实现。
运行时:调用实际对象(右边)的方法实现。的含义
虽然变量 list
的引用类型是 Collection
,但它的实际对象是 ArrayList
。在 运行时,所有通过 list
调用的方法都会按照 ArrayList
的具体实现来执行,这就是 多态(Polymorphism) 的核心机制。
运行时(Run Time)
- 实际对象决定方法的具体实现
尽管引用类型是Collection
,但底层实际对象是ArrayList
,所以add()
方法的实现是ArrayList
的版本。 - 示例:
Collection<String> list = new ArrayList<>(); list.add("A"); // 实际调用的是 ArrayList 的 add() 方法