【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)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

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

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

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

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

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


相关文章
|
2月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
167 15
|
3月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
45 1
|
4月前
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
42 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
|
4月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
74 2
|
5月前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第10天】Java零基础教学篇,手把手实践教学!
70 4
|
存储 并行计算 Java
Java8特性大全(最新版)
Java8特性大全(最新版)
|
21天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
149 60
【Java并发】【线程池】带你从0-1入门线程池
|
10天前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
61 23
|
17天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
86 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
1月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
117 14