基于Java的面向对象的多态示例
下是使用Java语言重新实现的面向对象多态性示例,包含详细注释和关键特性说明:
一、动态多态性(运行时多态)
示例:动物叫声
java
// 基类
abstract class Animal {
// 抽象方法(Java中的纯虚函数)
public abstract void speak();
}
// 派生类1
class Dog extends Animal {
@Override
public void speak() {
System.out.println("Dog barks: Woof!");
}
}
// 派生类2
class Cat extends Animal {
@Override
public void speak() {
System.out.println("Cat meows: Meow~");
}
}
public class DynamicPolymorphismDemo {
public static void main(String[] args) {
Animal[] animals = new Animal[2];
animals[0] = new Dog();
animals[1] = new Cat();
for (Animal animal : animals) {
animal.speak(); // 动态绑定:实际调用子类方法
}
}
}
输出结果:
markdown
Dog barks: Woof!
Cat meows: Meow~
核心机制:
abstract
关键字定义抽象类@Override
注解确保方法重写- 父类引用指向子类对象时的动态绑定
- Java通过 invokevirtual指令实现运行时多态
应用场景:
- 图形界面事件处理(如按钮点击不同响应)
- 游戏角色行为扩展
- 数据库操作工厂模式
二、静态多态性(编译时多态)
示例:图形面积计算
java
public class StaticPolymorphismDemo {
// 方法重载(静态多态)
public static double area(int radius) {
return Math.PI * radius * radius;
}
public static double area(double length, double width) {
return length * width;
}
public static void main(String[] args) {
System.out.println("Circle area: " + area(5)); // 调用第一个area
System.out.println("Rectangle area: " + area(4, 6)); // 调用第二个area
}
}
输出结果:
markdown
Circle area: 78.5398...
Rectangle area: 24.0
核心机制:
- 同名方法但参数列表不同
- 编译器根据调用时的参数类型进行绑定
- 不需要继承关系
三、抽象类与接口扩展
示例:形状面积计算
java
// 抽象类
abstract class Shape {
public abstract double area(); // 纯抽象方法
}
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
class Rectangle extends Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double area() {
return length * width;
}
}
public class AbstractClassDemo {
public static void main(String[] args) {
Shape[] shapes = new Shape[2];
shapes[0] = new Circle(5);
shapes[1] = new Rectangle(4, 6);
double totalArea = 0;
for (Shape shape : shapes) {
totalArea += shape.area(); // 多态调用
}
System.out.println("Total area: " + totalArea);
}
}
输出结果:
markdown
Total area: 102.5398...
四、接口实现多态
示例:绘图工具
java
// 接口
interface DrawingTool {
void draw();
}
// 实现类1
class Pencil implements DrawingTool {
@Override
public void draw() {
System.out.println("Drawing with pencil");
}
}
// 实现类2
class Brush implements DrawingTool {
@Override
public void draw() {
System.out.println("Painting with brush");
}
}
public class InterfaceDemo {
public static void main(String[] args) {
DrawingTool[] tools = new DrawingTool[2];
tools[0] = new Pencil();
tools[1] = new Brush();
for (DrawingTool tool : tools) {
tool.draw(); // 接口多态
}
}
}
输出结果:
markdown
Drawing with pencil
Painting with brush
五、多态性对比表
特性 | Java实现方式 | C++对应实现 | 关键差异 |
---|---|---|---|
动态多态 | 接口/抽象类 + 方法重写 | 虚函数 | Java使用 invokevirtual,C++使用虚表 |
静态多态 | 方法重载 | 函数重载 | 参数类型匹配规则略有不同 |
抽象类 | abstract关键字 | 抽象类 | Java不能多继承抽象类 |
接口 | interface关键字 | 纯虚类 | Java支持多实现接口 |
构造方法多态 | 不支持 | 构造函数重载 | Java没有构造函数重载机制 |
六、重要特性说明
-
方法重写(Override):
java
@Override public <T> void process(T data) { ... }
必须保持方法签名一致(参数类型、顺序、数量)
-
隐藏方法(Hide):
java
public class Parent { public void foo() { System.out.println("Parent"); } } public class Child extends Parent { public void foo() { System.out.println("Child"); } // 隐藏父类方法 }
-
协变返回类型:
java
public abstract class Animal { public abstract Animal getChild(); } public class Dog extends Animal { @Override public Dog getChild() { return new Dog(); } }
-
类型转换:
java
Animal animal = new Dog(); Dog dog = (Dog) animal; // 向下转型
七、使用场景建议
-
优先使用接口:
java
public interface Logger { void log(String message); }
- 接口适合定义多个不相关的实现
- 支持多继承(implements多个接口)
-
抽象类适用场景:
java
public abstract class Vehicle { protected String brand; public abstract void startEngine(); }
- 当需要共享部分实现时
- Java 8之后可以用default方法提供默认实现
八、性能优化建议
-
避免过度使用反射:
java
// 反射会降低性能 Method method = clazz.getDeclaredMethod("execute"); method.invoke(object);
-
合理使用多态:
java
// 频繁的对象创建和GC for(int i=0; i<10000; i++) { new Animal().speak(); }
-
使用final关键字:
java
public final void criticalMethod() { ... }
- 防止方法被重写
- 可能带来JIT编译优化
这些Java示例完整展示了面向对象多态性的核心概念,同时体现了Java语言特性(如接口、抽象类、注解等)。通过合理运用多态性,可以设计出高内聚、低耦合的软件系统,符合面向对象设计原则(OODP)。