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

什么是多态性 Java?
多态性 Java 当一个或多个类或对象通过继承相互关联时,就会发生多态性。多态性是指对象能够呈现多种形态的能力。继承允许用户继承属性和方法,而多态性则利用这些方法执行不同的任务。它们的目标都是通信,但实现方式可能有所不同。
例如,智能手机用于通信。通信方式可以是通话、短信、彩信或电子邮件。目标相同,即通信,但方式不同。这种行为是……的本质。 多态性现在我们将学习多态性。 Java 包含示例代码、图表和分步说明。
点击 开始 如果视频无法访问
为什么要使用多态性? Java?
多态性 Java 之所以采用这种模式,是因为它使代码更灵活、更易重用且更易于维护。父类型的单个引用变量可以指向多个子对象,因此同一个调用可以适应任何提供的子类。这种模式在通过专用子类添加新行为的同时,保持已测试代码不变,而这正是 Spring 和 Jakarta EE 等框架依赖它的原因。
Java OOP 中的多态性示例
考虑一个名为 账户 账户类包含存款和取款功能。该类有两个子类。储蓄账户和支票账户的存款和取款操作相同,因此可以直接使用账户类继承的方法。
Java 多态性示例
软件需求变化
需求规格发生了变化,这在软件行业很常见。需要添加一个具有透支功能的特权银行账户。透支功能允许客户提取超过账户可用余额的金额。特权账户的取款方法需要重新实现,而储蓄账户和支票账户中已测试的代码则保持不变。这种隔离的优势在于…… OOPS.
步骤1) 当调用储蓄账户的取款方法时,将执行父账户类中定义的方法。
步骤2) 当调用特权账户(透支额度)的取款方法时,将执行特权类中定义的取款方法。这种分发是 面向对象编程中的多态性.
方法重写 Java
方法重写是指在子类中重新定义超类方法的过程。子类保持与父类相同的上下文。tract,但提供了一个新的实现,该实现将在程序运行时选择。
方法重写的规则
- 方法签名(即方法名称、参数列表和返回类型)必须完全匹配。
- 重写的方法可以扩大访问权限,但不能缩小访问权限。如果基类中的方法为私有方法,子类可以将其设为公共方法,反之则不行。
例如:
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) 错误代码 = ? 这是因为子类无法访问父类的私有成员。





