验证多态最直观方式是用父类引用指向不同子类实例并调用重写方法:Shape s1=new Circle(); s1.draw()输出“画一个圆形”,Shape s2=new Rectangle(); s2.draw()输出“画一个矩形”,且s1.getClass().getSimpleName()返回Circle,证实动态绑定。

直接用测试类实例化不同子类对象,再通过父类引用统一调用方法,观察输出差异——这是验证多态最直观、最可靠的方式。
准备具备多态条件的类结构
确保满足三个硬性前提:有继承关系、子类重写了父类方法、使用父类类型声明变量但指向子类实例。例如:
- 定义抽象父类 Shape,含抽象方法
draw() - 子类 Circle 重写
draw()输出 “画一个圆形” - 子类 Rectangle 重写
draw()输出 “画一个矩形”
编写测试代码,聚焦运行时行为
不要只看编译是否通过,重点观察实际执行结果是否随对象真实类型变化:
- 声明
Shape s1 = new Circle();,调用s1.draw()→ 输出圆形描述 - 声明
Shape s2 = new Rectangle();,调用s2.draw()→ 输出矩形描述 - 可进一步把多个子类对象放入
List<Shape>,遍历调用draw(),一次验证批量表现
注意区分“能编译”和“真多态”
有些代码看似用了父类引用,但没体现多态本质:
立即学习“Java免费学习笔记(深入)”;
-
new Circle().draw()是直接调用,不涉及多态 -
Shape s = new Circle(); s.toString()调用的是Object的方法(未重写),不是多态表现 - 若子类没重写该方法,调用的仍是父类逻辑,此时属于“无差异化调用”,不算有效多态验证
补充验证:检查编译期与运行期差异
加一句 System.out.println(s1.getClass().getSimpleName());,确认引用类型是 Shape,但实际类是 Circle——这正是动态绑定发生的依据。


















