热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈java多态

浅谈java多态在最初学习java的时候,人们都知道,java这种面向对象的语言,一共有四大特征,分别是:封装、

浅谈java多态

在最初学习java的时候,人们都知道,java这种面向对象的语言,一共有四大特征,分别是:封装、继承、抽象、多态。

这些词经常被人们提及,那么,到底什么是多态呢?

一:多态是什么

java里,多态是同一个行为具有不同表现形式或形态的能力,即对象多种表现形式的体现,就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。


如上图所示:使用手机扫描二维码支付时,二维码并不知道客户是通过何种方式进行支付,只有通过二维码后才能判断是走哪种支付方式执行对应流程。

 

二:多态的好处

使用多态,我们可以很好的完成代码的解耦和工作,加强代码的可扩展性,是代码更加灵活,在不改变原有接口方法的情况下简化流程等,总结一下就是:

1、减耦合

2、增强可以替换性

3、可扩展性

4、灵活性等...

使用多态必须满足三个必要条件。

1、继承

2、重写

3、父类引用指向子类

在编写代码期间使用多态调用方法时,IDE首先会检查父类中是否有该方法,如果没有,则会编译报错。如果有父类中调用子类的同名方法。

 

三:编写一个简单的多态案例

 

/**
* 支付抽象类或者接口
*/
public abstract class Pay {
abstract public String pay();
}
/**
* 支付宝支付
*/
public class AliPay extends Pay {
@Override
   public String pay() {
System.out.println("支付宝pay");
       return "success";
   }
}
/**
* 微信支付
*/
public class WeixinPay extends Pay {
@Override
   public String pay() {
System.out.println("微信Pay");
       return "success";
   }
}
/**
* 银联支付
*/
public class YinlianPay extends Pay {
@Override
   public String pay() {
System.out.println("银联支付");
       return "success";
   }
}

测试支付

public static void main(String[] args) {
/**
        * 测试支付宝支付多态应用
        */
       Pay pay = new AliPay();
       pay.pay();
       /**
        * 测试微信支付多态应用
        */
       pay = new WeixinPay();
       pay.pay();
       /**
        * 测试银联支付多态应用
        */
       pay = new YinlianPay();
       pay.pay();
       }
------>输出结果如下:
     支付宝pay
微信Pay
银联支付

 

四:抽象类和接口

在上面,我们定义了一个抽象类,抽象类中有一个抽象方法pay(),然后其他具体支付类继承这个抽象类重写它的pay()方法。但是,在实际开发中,我们很少去主动定义一个抽象类,我们每天写代码,更多的是创建一个接口,然后定义接口实现类,在实现类中做对应的业务逻辑处理。

那么,抽象类和接口有什么区别呢?前面说道多态的三个必要条件中有一个是继承,但是我们在定义接口时,是使用的实现,那么,继承和实现又是什么关系呢?为什么实现也能成就多态呢?

首先,我们先来聊一下抽象类和接口的相同点和不同点吧。

1、java中,抽象类和接口都不能直接进行实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类要被子类继承,接口要被类实现。

3、接口只能做方法申明,抽象类既可以做方法申明,还可以做方法实现。

4、接口中的变量只能是静态的公共变量,抽象类中的变量是普通的变量,即常量。

5、抽象类中可以没有抽象方法

6、如果一个类中有抽象方法,那么这个类是一个抽象类

7、接口可以继承接口,并且可以多继承,但是类只能单继承。

....如有描述不对之处,欢迎指点,以便于及时改正。

 

好了,那么我们再来看一下继承和实现的关系。

我们在讲解多态时,讲述过多态必须满足三大条件之一有一条是继承。但是,当接口有多个实现类时,也能构成多态。所以在这里我对这两者的理解是 实现是多态的另一种表现形式。这句话也能有很大的问题,也可能不对。

在网上查阅了一下相关资料,大都是讲解继承和实现的区别,基于表现形式上的及功能上的,但是对于继承和实现这一块的定义,又多态条件之一继承,这一块目前感觉自己可以进行功能区分,但是还是不能很好的去具体讲解。先不去钻这个牛角尖了。

 

 

2018111722:19:33

 

 




推荐阅读
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
author-avatar
cws401_712
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有