【Java】多态性【主线学习笔记】
文章目录
- 前言
- 多态性
- 1、编译时多态性(静态多态性):
- 2、运行时多态性(动态多态性)
- 3、多态性的实用性
- 4、多态性的优点与弊端
- 下一篇
- 点击跳转《【Java】多态性-向下转型【主线学习笔记】》
前言
Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。
多态性
在 Java 中,多态性是一种面向对象编程的特性,允许同一个方法或对象在不同的上下文中表现出不同的行为。多态性通过方法重写(Override)和方法重载(Overload)来实现,可以使代码调用更加灵活和可扩展。
1、编译时多态性(静态多态性):
方法重载是指同一个类中可以有多个同名的方法,但参数类型或参数数量不同。编译器会在编译时根据方法的参数来决定调用哪个方法。
class Example {void display(int a) {System.out.println("整数: " + a);}void display(String a) {System.out.println("字符串: " + a);}
}public class Test {public static void main(String[] args) {Example obj = new Example();obj.display(10); // 输出:整数: 10obj.display("Hello"); // 输出:字符串: Hello}
}
2、运行时多态性(动态多态性)
方法重写是指子类提供了父类方法的具体实现。在运行时,Java会根据实际对象的类型来调用对应的方法,这就是动态多态性。运行时多态性是通过继承和方法重写来实现的,它使得程序能够根据实际对象的类型来执行相应的行为。
// 父类 BankCard,代表通用的银行卡
class BankCard {// 模拟刷卡方法void swipe() {System.out.println("使用银行卡刷卡");}
}// 子类 CreditCard,代表信用卡
class CreditCard extends BankCard {@Overridevoid swipe() {System.out.println("使用信用卡刷卡并提供信用额度");}
}// 子类 DebitCard,代表借记卡
class DebitCard extends BankCard {@Overridevoid swipe() {System.out.println("使用借记卡刷卡并扣除账户余额");}void shape(){System.out.println("这是一个长方形的卡");}
}// 消费类,模拟支付场景
class PaymentProcessor {// 动态多态性体现在这里,使用父类 BankCard 作为参数public void processPayment(BankCard card) {card.swipe(); // 调用的是具体卡片对象的 swipe() 方法}
}// 测试类
public class TestPolymorphism {public static void main(String[] args) {PaymentProcessor processor = new PaymentProcessor();// 使用信用卡进行支付processor.processPayment(new CreditCard()); // 输出:使用信用卡刷卡并提供信用额度// 使用借记卡进行支付processor.processPayment(new DebitCard()); // 输出:使用借记卡刷卡并扣除账户余额}
}
3、多态性的实用性
适用于方法,不适用于属性。
4、多态性的优点与弊端
- 优点:在软件系统的各种组件中,如模块、类、功能等,应该在不修改现有代码的基础上,引入新功能。极大的减少了代码的冗余,不需要定义多个重载的方法。
- 弊端:不能直接调用Man中的特有属性和方法。例如上面的银行卡案例,在消费类模拟支付场景的类中,是无法使用card.shape()这一方法,因为声明为父类的引用,所以你无法预先判断传进来的card是子类借记卡还是信用卡又或者是父类银行卡类别。