【Java SE】面向对象三大特性之多态

简介: 【Java SE】面向对象三大特性之多态

🐳何为多态?

多态,通俗一点说就是在完成某一个行为的时候,不同的对象会产生不同的形态。

比如说:打印机在完成打印行为的时候,可以根据不同的对象打印不同的类型,有黑白,有彩色等等,打印的结果是不一样的。

总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。

🐳如何实现多态?

在java中要实现多态,必须要满足如下几个条件,缺一不可:

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写

3. 通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

这里以一个支付的结果来作为测试:

1. //提供一个抽象类或者接口
2. //这里提供一个抽象类
3. public abstract class Pay {
4. abstract String  PayMethod();
5. }
6. 
7. public  class PayPal extends Pay {
8. 
9. @Override
10. public String PayMethod() {
11.         System.out.println("支付宝Pay........");
12. return "success";
13.     }
14. }
15. 
16. public class UnionPay extends Pay {
17. @Override
18. public  String PayMethod() {
19.         System.out.println("银联Pay........");
20. return "success";
21.     }
22. }
23. 
24. public class WeChatPay extends Pay {
25. 
26. @Override
27. public  String PayMethod() {
28.         System.out.println("微信Pay........");
29. return "success";
30.     }
31. }
32. 
33. public class Main {
34. public static void main(String[] args) {
35. //支付宝
36.         Pay pay1=new PayPal();
37.         pay1.PayMethod();
38. //银联
39.         Pay pay2=new UnionPay();
40.         pay2.PayMethod();
41. //微信
42.         Pay pay3=new WeChatPay();
43.         pay3.PayMethod();
44.     }
45. 
46. }

这就体现了多态。其中也包含了向上转型的方法。

🐳什么是向上转型?

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。

语法格式:父类类型 对象名 = new 子类类型()

就比如上面的:

1. //支付宝
2.         Pay pay1=new PayPal();
3.         pay1.PayMethod();

向上转型的优点:让代码实现更简单灵活。

向上转型的缺陷:不能调用到子类特有的方法。

有向上转型肯定会有向下转型啦!

🐳什么是向下转型?

向上转型会导致无法调用子类特有的方法,但是有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。

1. public abstract class Pay {
2. abstract String  PayMethod();
3. }
4. 
5. public  class PayPal extends Pay {
6. 
7. @Override
8. public String PayMethod() {
9.         System.out.println("支付宝Pay........");
10. return "success";
11.     }
12. public void prompt(){
13.         System.out.println("余额不足,请选择其他方式进行支付");
14.     }
15. }
16. 
17. public class Main {
18. public static void main(String[] args) {
19. //支付宝
20.         Pay pay1=new PayPal();
21.         pay1.PayMethod();
22. 
23. //直接强转
24.         pay1=(PayPal)pay1;
25. 
26.         ((PayPal) pay1).prompt();
27. //利用instanceof
28. if(pay1 instanceof PayPal){
29.             pay1=(PayPal)pay1;
30.             ((PayPal) pay1).prompt();
31. 
32.         }
33. 
34. 
35.     }
36. 
37. }

注意:使用强转符 ()可能存在ClassCastException错误。

向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换。

🐳多态的优点:

可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。

灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。

简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

需要注意的是要避免在构造方法中调用重写的方法。

尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题。

🐳什么是静态绑定与动态绑定?

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表方法重载

动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。


相关文章
|
18天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
19 1
|
1月前
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
24 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
|
1月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
37 2
|
2月前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第10天】Java零基础教学篇,手把手实践教学!
35 4
|
2月前
|
Java 编译器 程序员
Java多态背后的秘密:动态绑定如何工作?
本文介绍了Java中多态的实现原理,通过动态绑定和虚拟方法表,使得父类引用可以调用子类的方法,增强了代码的灵活性和可维护性。文中通过具体示例详细解析了多态的工作机制。
68 4
|
7月前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
54 3
|
7月前
|
Java 程序员 编译器
【详识JAVA语言】面向对象程序三大特性之二:继承
【详识JAVA语言】面向对象程序三大特性之二:继承
72 2
|
6月前
|
Java 开发者
Java 面向对象新视界:揭秘子类如何“继承”父类精华,再添“创新”之笔
【6月更文挑战第16天】在Java的面向对象世界,子类继承父类的特性,如`Circle`继承`Shape`,展示“is-a”关系。子类不仅保留父类的`color`和`display`方法,还添加了`radius`属性及定制的显示逻辑。这种继承与创新允许代码复用,增强灵活性和可扩展性,使得构建复杂系统变得更加高效和模块化。通过持续的继承与定制,开发者能构建出一系列独具特色的类,充分展现面向对象编程的力量。
157 57
|
5月前
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
|
6月前
|
Java 数据安全/隐私保护 开发者
Java是一种完全支持面向对象编程的语言,其面向对象特性包括封装、继承、多态和抽象等
【6月更文挑战第18天】**面向对象编程(OOP)通过对象封装状态和行为,实现问题域的抽象。Java全面支持OOP,核心特性包括**: - **封装**:保护数据安全,隐藏内部细节。 - **继承**:子类继承父类属性和行为,促进代码重用。 - **多态**:一个接口多种实现,增强灵活性和扩展性。 - **抽象**:通过接口和抽象类抽离共性,简化复杂性。 **Java的OOP便于理解和解决复杂系统问题。**
66 3
下一篇
DataWorks