亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java 多态详解:概念、方法重写与动态绑定实战

什么是 Java 多态?

多态 是 Java 面向对象编程(OOP)的核心概念。当类通过继承关联时产生,允许单一接口代表不同底层形式。结果是方法调用可根据运行时实际对象类型调用不同实现。

就像智能手机可通过语音、短信、图片、邮件通信。目标——通信——相同,但每种模式行为不同。这就是生活中的多态。

你将学到

OOP 中的 Java 多态示例

考虑基类 Account 提供 deposit() 和 withdraw()。两个子类 SavingsAccount 和 CheckingAccount 继承这些方法,因为操作相同。

Java 多态详解:概念、方法重写与动态绑定实战

适应需求变更

当需要透支等新功能时,PrivilegedAccount 子类可重写 withdraw() 提供新逻辑,无需碰现有子类。这演示了多态的可维护性优势。

Java 多态详解:概念、方法重写与动态绑定实战

Java 方法重写

重写发生在子类为父类已定义的方法提供自己的实现。方法签名(名称、参数、返回类型)必须完全匹配。

关键规则

示例:

class Doctor {
    public void treatPatient() {
        // 通用治疗逻辑
    }
}
class Surgeon extends Doctor {
    @Override
    public void treatPatient() {
        // 专科手术治疗
    }
}
public class Run {
    public static void main(String[] args) {
        Doctor doctor = new Doctor();
        doctor.treatPatient(); // 执行 Doctor.treatPatient()
        Surgeon surgeon = new Surgeon();
        surgeon.treatPatient(); // 执行 Surgeon.treatPatient()
    }
}

重载 vs 重写

方法重载方法重写
同一类中,同名,参数列表不同。 父类方法在子类中用相同签名重新定义。
示例:
void sum(int a, int b);
void sum(int a, int b, int c);
void sum(float a, double b);
示例:
class X { int sum() { ... } }
class Y extends X {
    @Override int sum() { ... }
}

动态多态(运行时)

当父类引用指向子类对象时,JVM 在运行时解析方法调用。这是真正的多态。

Doctor doc = new Surgeon();
doc.treatPatient(); // 执行 Surgeon.treatPatient()

实际调用的方法取决于对象的运行时类型,而非引用类型。

静态 vs 动态多态

静态多态(重载)在编译期解析,动态多态(重写)在运行期解析。

静态多态动态多态
方法重载;编译期绑定。 方法重写;运行时绑定。
示例:
void sum(int a, int b);
void sum(float a, double b);
示例:
Doctor d = new Surgeon();
d.treatPatient();

使用 super 关键字

子类需扩展父类方法时,super 先调用父类实现再添加自身逻辑。

class Surgeon extends Doctor {
    @Override
    public void treatPatient() {
        super.treatPatient(); // 基础逻辑
        // 外科医生特有逻辑
    }
}

同样,super 可访问父类的 protected 或 public 字段。

实战示例:继承、多态与 Super

将下面代码复制到 IDE 观察输出。

public class Test {
    public static void main(String[] args) {
        X x = new X();
        Y y = new Y();
        y.m2();
        // 取消注释查看继承效果
        // x.m1();
        // y.m1();
        // x = y; // 父引用指向子对象
        // x.m1();
        // y.a = 10; // 错误:a 是 private
    }
}
class X {
    private int a;
    int b;
    public void m1() {
        System.out.println("This is method m1 of class X");
    }
}
class Y extends X {
    int c;
    @Override
    public void m1() {
        System.out.println("This is method m1 of class Y");
    }
    public void m2() {
        super.m1();
        System.out.println("This is method m2 of class Y");
    }
}

核心要点

java

  1. C# 抽象类实战教程:从定义到派生的完整代码示例
  2. C# 接口详解:定义、示例与实战应用
  3. 精通 Java 多态:核心概念、实战示例与最佳实践
  4. Java 面向对象核心概念全解析:抽象、封装、继承、多态与关联关系实战
  5. Java 封装完全指南:数据隐藏、访问器/修改器、实战案例与核心优势
  6. Java String length() 方法:获取字符串长度(示例)
  7. Java String.charAt() 详解:语法、返回类型、异常与实战示例
  8. Java String.contains() 方法:检查子字符串是否存在(实战示例)
  9. 精通 Java String.endsWith():检查字符串后缀(示例)
  10. Java static 详解:静态变量、方法、代码块与实战示例
  11. Java 接口 vs 抽象类:如何选择合适的抽象方式
  12. Java BufferedReader 读取文件:实战指南与示例