多态性 Java (静态和动态)

⚡ 智能摘要

多态性 Java 它允许一个接口代表多种形式,因此同一个方法名在相关的类中表现不同。它是面向对象设计的支柱之一,能够促进灵活性、代码重用,并有助于对传统的银行、医疗和企业系统进行清晰的扩展。

  • 🎭 多种形式,同一个名称: 多态性 Java 允许同一方法名称根据执行时的实际对象类型派发到不同的实现。
  • 🔀 两种口味: 编译时多态性使用方法重载,而运行时多态性通过继承和 JVM 使用方法重写。
  • ⛓️ 静态绑定与动态绑定: 重载调用在编译时通过静态绑定解析,而重写调用在运行时通过动态绑定解析。
  • ✅ 超级关键词能力: super关键字允许子类在添加自己的特殊行为之前调用父类的实现。
  • 🧪 实际应用范围: 银行账户、医院员工层级结构和形状渲染引擎都依赖于多态性来满足新的需求,而不会破坏已测试的代码。

多态性 Java

什么是多态性 Java?

多态性 Java 当一个或多个类或对象通过继承相互关联时,就会发生多态性。多态性是指对象能够呈现多种形态的能力。继承允许用户继承属性和方法,而多态性则利用这些方法执行不同的任务。它们的目标都是通信,但实现方式可能有所不同。

例如,智能手机用于通信。通信方式可以是通话、短信、彩信或电子邮件。目标相同,即通信,但方式不同。这种行为是……的本质。 多态性现在我们将学习多态性。 Java 包含示例代码、图表和分步说明。

点击 开始 如果视频无法访问

为什么要使用多态性? Java?

多态性 Java 之所以采用这种模式,是因为它使代码更灵活、更易重用且更易于维护。父类型的单个引用变量可以指向多个子对象,因此同一个调用可以适应任何提供的子类。这种模式在通过专用子类添加新行为的同时,保持已测试代码不变,而这正是 Spring 和 Jakarta EE 等框架依赖它的原因。

Java OOP 中的多态性示例

考虑一个名为 账户 账户类包含存款和取款功能。该类有两个子类。储蓄账户和支票账户的存款和取款操作相同,因此可以直接使用账户类继承的方法。

单一继承 Java

Java 多态性示例

软件需求变化

需求规格发生了变化,这在软件行业很常见。需要添加一个具有透支功能的特权银行账户。透支功能允许客户提取超过账户可用余额的金额。特权账户的取款方法需要重新实现,而储蓄账户和支票账户中已测试的代码则保持不变。这种隔离的优势在于…… OOPS.

Java 多态性

步骤1) 当调用储蓄账户的取款方法时,将执行父账户类中定义的方法。

Java 多态性

步骤2) 当调用特权账户(透支额度)的取款方法时,将执行特权类中定义的取款方法。这种分发是 面向对象编程中的多态性.

Java 多态性

方法重写 Java

方法重写是指在子类中重新定义超类方法的过程。子类保持与父类相同的上下文。tract,但提供了一个新的实现,该实现将在程序运行时选择。

方法重写的规则

  • 方法签名(即方法名称、参数列表和返回类型)必须完全匹配。
  • 重写的方法可以扩大访问权限,但不能缩小访问权限。如果基类中的方法为私有方法,子类可以将其设为公共方法,反之则不行。

方法重写的规则 Java

例如:

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
class Run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor();
    // treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient method in class Surgeon will be executed
    surgeonObj.treatPatient();
  }
}

方法重载和方法重写的区别

方法重载是指在同一个类中,方法名称相同但签名不同的情况。方法重写是指在父类和子类之间,子类重新定义父类中声明的方法。

方法重载
方法覆盖
方法重载是指在同一个类中,多个方法具有相同的名称但签名不同。 方法重写是指在子类中重新定义超类中的某个方法。在这种情况下,方法的签名保持不变。
例如:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
例如:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
    //signature is same
 }
}

什么是动态多态性?

面向对象编程中的动态多态是一种机制,它允许在超类和子类中定义多个名称和签名相同的方法。对重写方法的调用在运行时通过 JVM 内部的动态绑定来解析。

动态多态示例

超类的引用变量可以引用子类对象:

 Doctor obj = new Surgeon();

请考虑以下陈述:

obj.treatPatient();

这里是参考变量 OBJ 属于父类,但它指向的对象属于子类,如多态性示意图所示。

通话 obj.treatPatient() 将执行子类 Surgeon 的 treatPatient() 方法。当使用基类引用调用方法时,JVM 会根据引用指向的实际对象来决定调用哪个方法。即使 OBJ 是指向 Doctor 对象的引用,它调用 Surgeon 对象的方法,因为它指向的是一个 Surgeon 对象。这个决定是在运行时做出的,所以才被称为运行时决策。 动态多态 或者运行时多态性。

静态多态性和动态多态性的区别

静态多态性 Java 动态多态是一种在编译时收集调用方法所需信息的多态类型,而动态多态是一种在运行时收集调用方法所需信息的多态类型。

静态多态
动态多态
它与方法重载有关。 它与方法重写有关。
编译时会解决所有错误(如有)。由于代码在编译期间不会执行,因此名称是静态的。

例如:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
当引用变量调用重写的方法时,要调用的方法取决于引用变量指向的对象。这只能在代码运行时确定,因此方法名是动态的。

例如:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

超级关键词 Java

如果 Surgeon 类中的 treatPatient 方法想要执行 Doctor 类中定义的功能,然后再执行它自己的特定行为,该怎么办?在这种情况下,关键字 super 可用于从子类访问父类的方法。Surgeon 类中的 treatPatient 方法可以写成:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

关键字 super 可用于在子类中访问父类的任何数据成员或方法。接下来,我们将学习 super 关键字。 遗产以及多态性 Java 带有示例程序。

例如:学习继承、多态和 super 关键字

步骤1) 将以下代码复制到编辑器中。

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;// parent pointing to object of child
        //x.m1() ;
        //y.a=10;
   }
}
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; // new instance variable of class Y
         public void m1(){
            // overridden method
            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");
      }
}

步骤2) 保存、编译并运行代码。观察输出结果。

步骤3) 取消第6至9行的注释。保存、编译并运行代码。观察输出结果。

步骤4) 取消第 10 行的注释。保存并编译代码。

步骤5) 错误代码 = ? 这是因为子类无法访问父类的私有成员。

常见问题

多态性 Java 对象能够呈现多种形式的能力就是面向对象编程的核心特性。同一个方法名可以根据运行时引用的子类对象而执行不同的代码。

Java 支持通过方法重载实现编译时多态,以及通过方法重写实现运行时多态。方法重载在编译时通过静态绑定实现,而方法重写在运行时通过 JVM 处理的动态绑定实现。

静态绑定在编译时将方法调用与其定义关联起来,用于方法重载。动态绑定在运行时根据实际对象类型关联调用,用于方法重写。 Java.

`super` 关键字允许子类调用父类重写的方法或访问父类的数据成员。这使得子类可以重用父类的逻辑,并在其基础上添加自定义行为。

像 ChatGPT 和 GitHub Copilot Chat 这样的 AI 导师可以解释多态性。 Java 通过自定义类比,生成练习题,讲解继承树,并测试学习者对静态绑定与动态绑定的理解,以帮助他们更快地掌握相关知识。

是的。像 Cursor、Sourcegraph Cody 和 IntelliJ AI Assistant 这样的 AI 驱动的重构助手可以识别重复的条件语句,建议类层次结构,并重写遗留代码。 Java 编写代码,使方法重写替换重复的 if-else 链。

总结一下这篇文章: