当前位置: 首页 > news >正文

基于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~

核心机制:​

  1. abstract关键字定义抽象类
  2. @Override注解确保方法重写
  3. 父类引用指向子类对象时的动态绑定
  4. 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没有构造函数重载机制

六、重要特性说明

  1. 方法重写(Override)​

    java

    @Override
    public <T> void process(T data) { ... }

    必须保持方法签名一致(参数类型、顺序、数量)

  2. 隐藏方法(Hide)​

    java

    public class Parent {
        public void foo() { System.out.println("Parent"); }
    }
    
    public class Child extends Parent {
        public void foo() { System.out.println("Child"); } // 隐藏父类方法
    }
  3. 协变返回类型

    java

    public abstract class Animal {
        public abstract Animal getChild();
    }
    
    public class Dog extends Animal {
        @Override
        public Dog getChild() { return new Dog(); }
    }
  4. 类型转换

    java

    Animal animal = new Dog();
    Dog dog = (Dog) animal; // 向下转型

七、使用场景建议

  1. 优先使用接口

    java

    public interface Logger {
        void log(String message);
    }
    • 接口适合定义多个不相关的实现
    • 支持多继承(implements多个接口)
  2. 抽象类适用场景

    java

    public abstract class Vehicle {
        protected String brand;
        public abstract void startEngine();
    }
    • 当需要共享部分实现时
    • Java 8之后可以用default方法提供默认实现

八、性能优化建议

  1. 避免过度使用反射

    java

    // 反射会降低性能
    Method method = clazz.getDeclaredMethod("execute");
    method.invoke(object);
  2. 合理使用多态

    java

    // 频繁的对象创建和GC
    for(int i=0; i<10000; i++) {
        new Animal().speak();
    }
  3. 使用final关键字

    java

    public final void criticalMethod() { ... }
    • 防止方法被重写
    • 可能带来JIT编译优化

这些Java示例完整展示了面向对象多态性的核心概念,同时体现了Java语言特性(如接口、抽象类、注解等)。通过合理运用多态性,可以设计出高内聚、低耦合的软件系统,符合面向对象设计原则(OODP)。

相关文章:

  • Maven指定JDK
  • function call为大模型装上触手
  • Java中的分布式锁:原理、实现与最佳实践
  • webpack介绍
  • Android Compose Surface 完全指南:从入门到花式操作
  • 四种常见的 API 架构风格(带示例)
  • vue2中,在table单元格上右键,对行、列的增删操作(模拟wps里的表格交互)
  • 无人机全景应用解析与技术演进趋势
  • AI开源竞赛与硬件革命:2025年3月科技热点全景解读——阿里、腾讯领跑开源,英特尔、台积电重塑算力格局
  • 考研数学复习之定积分定义求解数列极限(超详细教程)
  • HTML5教程之标签(7)
  • Java关键字与标识符
  • 基于6自由度搬运机器人完成单关节伺服控制实现的详细步骤及示例代码
  • 基于YOLO11深度学习的遥感视角地面房屋建筑检测分割与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能
  • 【GNN】第四章:图卷积层GCN
  • Linux 服务器安全配置:密码复杂度与登录超时设置
  • 缓存id路由页面返回,历史路由栈
  • SpringBoot基础Kafka示例
  • 深度学习subword分词BPE
  • 在 DEM 中模拟粒子破损
  • 乡村快递取件“跑腿费”屡禁不止?云南元江县公布举报电话
  • 明天起,沪苏湖高铁、杭温高铁推出13款新型票制产品
  • 吴清稳市场稳预期发布会十要点:谈平准基金、股市稳定、公募改革和巴菲特
  • 央行宣布优化两项支持资本市场的货币政策工具
  • 苹果用户,安卓来“偷心”
  • 中俄合拍电影《红丝绸》将于今年9月在中国上映