多态性 Java (静态和动态)

什么是多态性 Java?

多态性 in Java 当一个或多个类或对象通过继承而相互关联时,就会发生多态性。多态性是指对象具有多种形式的能力。继承允许用户继承属性和方法,而多态性则使用这些方法执行不同的任务。因此,多态性的目标是沟通,但方法却不同。

例如,你有一部智能手机用于通信。你选择的通信方式可以是任何方式。可以是电话、短信、图片信息、邮件等。因此,目标是共同的,即通信,但它们的方法不同。这称为 多态性。 现在我们将学习多态性 Java 举个例子。

点击 点击这里 如果视频无法访问

Java OOP 中的多态性示例

我们有一个父类“Account”,具有存款和取款功能。Account 有 2 个子类。储蓄账户和支票账户的存款和取款操作相同。因此,从 Account 类继承的方法将起作用。

单一继承 Java
Java 多态性示例

软件需求变化

需求规范发生了变化,这在软件行业中很常见。您应该添加具有透支功能的特权银行帐户功能。对于背景,透支是一种可以提取超过帐户余额的金额的功能。因此,需要重新实现特权的提取方法。但您不会更改储蓄和支票账户中测试的代码片段。这是 OOPS

Java 多态性

步骤1) 这样,当调用储蓄账户的“提取”方法时,就会执行父账户类中的方法

Java 多态性

步骤2) 但是,当调用特权帐户(透支功能)的“Withdraw”方法时,将执行特权类中定义的 withdraw 方法。这是 OOP 中的多态性。

Java 多态性

方法重写 Java

方法覆盖是在子类中重新定义超类方法。

方法重写的规则

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

方法重写的规则 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
 }
}

什么是动态多态性?

OOP 中的动态多态性是一种机制,通过该机制可以在超类和子类中定义具有相同名称和签名的多个方法。对重写方法的调用在运行时解析。

动态多态性示例:

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

 Doctor obj = new Surgeon();

考虑一下这个说法

obj.treatPatient();

这里引用变量“obj”属于父类,但它指向的对象属于子类(如下面的多态性图表示例所示)。

obj.treatPatient() 将执行子类 Surgeon 的 treatPatient() 方法

如果使用基类引用来调用方法,则 JVM 根据引用指向的对象决定要调用的方法

例如,尽管 obj 是 Doctor 的引用,但它调用 Surgeon 的方法,因为它指向 Surgeon 对象

这是在运行时决定的,因此称为 动态 or 运行时多态

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

静态多态性 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(){
            // overriden 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 是一种在编译时收集用于调用方法的信息的多态性,而动态多态性是一种在运行时收集用于调用方法的信息的多态性。
  • Super 关键字可用于从子类访问父类的方法。