• java中面向对象三大特性有哪些?


    何为多态?

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

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

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

    如何实现多态?

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

    1. 必须在 继承 体系下

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

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

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

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

    1. class="prettyprint hljs scala" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">//提供一个抽象类或者接口
    2. //这里提供一个抽象类
    3. public abstract class Pay {
    4. abstract String PayMethod();
    5. }
    6. public class PayPal extends Pay {
    7. @Override
    8. public String PayMethod() {
    9. System.out.println("支付宝Pay........");
    10. return "success";
    11. }
    12. }
    13. public class UnionPay extends Pay {
    14. @Override
    15. public String PayMethod() {
    16. System.out.println("银联Pay........");
    17. return "success";
    18. }
    19. }
    20. public class WeChatPay extends Pay {
    21. @Override
    22. public String PayMethod() {
    23. System.out.println("微信Pay........");
    24. return "success";
    25. }
    26. }
    27. public class Main {
    28. public static void main(String[] args) {
    29. //支付宝
    30. Pay pay1=new PayPal();
    31. pay1.PayMethod();
    32. //银联
    33. Pay pay2=new UnionPay();
    34. pay2.PayMethod();
    35. //微信
    36. Pay pay3=new WeChatPay();
    37. pay3.PayMethod();
    38. }
    39. }

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

    什么是向上转型?

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

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

    就比如上面的:

    1. class="hljs fsharp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">//支付宝
    2. Pay pay1=new PayPal();
    3. pay1.PayMethod();

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

    向上转型的

    缺陷

    :不能调用到子类特有的方法。

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

    什么是向下转型?

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

    1. class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public abstract class Pay {
    2. abstract String PayMethod();
    3. }
    4. public class PayPal extends Pay {
    5. @Override
    6. public String PayMethod() {
    7. System.out.println("支付宝Pay........");
    8. return "success";
    9. }
    10. public void prompt(){
    11. System.out.println("余额不足,请选择其他方式进行支付");
    12. }
    13. }
    14. public class Main {
    15. public static void main(String[] args) {
    16. //支付宝
    17. Pay pay1=new PayPal();
    18. pay1.PayMethod();
    19. //直接强转
    20. pay1=(PayPal)pay1;
    21. ((PayPal) pay1).prompt();
    22. //利用instanceof
    23. if(pay1 instanceof PayPal){
    24. pay1=(PayPal)pay1;
    25. ((PayPal) pay1).prompt();
    26. }
    27. }
    28. }

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

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

    多态的优点:

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    选择收银系统主要看哪些方面?
    基于JavaSwing聊天系统的设计与实现(加好友 视频 发文件 远程监控) 毕业设计
    深度学习 - 46.DIN 深度兴趣网络
    LongVLM:让大模型解读长视频 SOTA 的方法
    【安装教程】vscode安装教程(超详细)
    《OpenDRIVE1.6规格文档》5
    工程(十三)——基于激光视觉的SLAM三维重建
    React组件生命周期
    C++菜鸟日记1
    花14天梳理了4月份各大厂问得最多的50道Java基础面试题
  • 原文地址:https://blog.csdn.net/Java_ttcd/article/details/126278674