我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:彩66彩票 > 多态逻辑 >

Java多态的介绍

归档日期:05-25       文本归类:多态逻辑      文章编辑:爱尚语录

  封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

  继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。,同时继承也为实现多态做了铺垫。那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开:

  所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

  比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:

  这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。

  诚然,要理解多态我们就必须要明白什么是“向上转型”。在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,酒(Win)是父类,剑南春(JNC)、五粮液(WLY)、酒鬼酒(JGJ)是子类。我们定义如下代码:

  对于这个代码我们非常容易理解无非就是实例化了一个剑南春的对象嘛!但是这样呢?

  在这里我们这样理解,这里定义了一个Wine 类型的a,它指向JNC对象实例。由于JNC是继承与Wine,所以JNC可以自动向上转型为Wine,所以a是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。

  但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了---1。

  从程序的运行结果中我们发现,a.fun1()首先是运行父类Wine中的fun1().然后再运行子类JNC中的fun2()。

  分析:在这个程序中子类JNC重载了父类Wine的方法fun1(),重写fun2(),而且重写后的fun1(String a)与 fun1()不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的Wine类型引用是不能引用fun1(String a)方法。而子类JNC重写了fun2() ,那么指向JNC的Wine引用会调用JNC中fun2()方法。

  指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

  对于面向对象而已,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

  在刚刚开始就提到了继承在为多态的实现做了准备。子类Child继承父类Father,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类Father对象,也可以处理子类Child对象,当相同的消息发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为,这就是多态。即多态性就是相同的消息使得不同的类做出不同的响应。

  重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

  向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

  只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

  对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

  基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。

  在上面的代码中JNC、JGJ继承Wine,并且重写了drink()、toString()方法,程序运行结果是调用子类中方法,输出JNC、JGJ的名称,这就是多态的表现。不同的对象可以执行相同的行为,但是他们都需要通过自己的实现方式来执行,这就要得益于向上转型了。

  我们都知道所有的类都继承自超类Object,toString()方法也是Object中方法,当我们这样写时:

  Object、Wine、JGJ三者继承链关系是:JGJ—Wine—Object。所以我们可以这样说:当子类重写父类的方法被调用时,只有对象继承链中的最末端的方法才会被调用。但是注意如果这样写:

  所以基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。

  如果父类是抽象类,那么子类必须要实现父类中所有的抽象方法,这样该父类所有的子类一定存在统一的对外接口,但其内部的具体实现可以各异。这样我们就可以使用顶层类提供的统一接口来处理该层次的方法。

  继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。

  在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。

  继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

  通过上面的讲述,可以说是对多态有了一定的了解。现在趁热打铁,看一个实例。该实例是有关多态的经典例子,摘自:。

  在这里看结果1、2、3还好理解,从4开始就开始糊涂了,对于4来说为什么输出不是“B and B”呢?

  首先我们先看一句话:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这句话对多态进行了一个概括。其实在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

  方法已经找到了但是我们这里还是存在一点疑问,我们还是来看这句话:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这我们用一个例子来说明这句线.show(b);

  这里a2是引用变量,为A类型,它引用的是B对象,因此按照上面那句话的意思是说有B来决定调用谁的方法,所以a2.show(b)应该要调用B中的show(B obj),产生的结果应该是“B and B”,但是为什么会与前面的运行结果产生差异呢?这里我们忽略了后面那句话“但是这儿被调用的方法必须是在超类中定义过的”,那么show(B obj)在A类中存在吗?根本就不存在!所以这句话在这里不适用?那么难道是这句话错误了?非也!其实这句话还隐含这这句话:它仍然要按照继承链中调用方法的优先级来确认。所以它才会在A类中找到show(A obj),同时由于B重写了该方法所以才会调用B类中的方法,否则就会调用A类中的方法。

  所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

  多态的概述什么是多态:多种形态。分两部分:功能多态:一个行为多种实现方式体现:重写和重载 形态多态:一个类型的多种表现形式比如:动物多种表现形式:猫、狗Animala=newDog();//父类的引用...博文来自:zyyy的博客

  通过上面的讲述,可以说是对多态有了一定的了解。现在趁热打铁,看一个实例。该实例是有关多态的经典例子,摘自:博文来自:rqrtqqpqi5的专栏

  多态性是Java面向对象的一个重要机制,本文将向您详细介绍Java语言中多态性的实现原理和方法,通过多态一点带出更多Java面向对象有趣而实用的知识。AD:多态性是面向对象程序设计代码重用的一个重要机...博文来自:u011860731的专栏

  1.java多态性: 1java实现多态的前提:继承、覆写; 2覆写调用的前提:看new是哪个类的对象,而后看方法是否被子类覆写,若覆写则调用覆写的方法,若没覆写则调用父类的方法;2.java多态...博文来自:zhangwenxatu的博客

  什么是多态多态是同一个行为具有多个不同表现形式或形态的能力。比如我们说“宠物”这个对象,它就有很多不同的表达或实现,比如有小猫、小狗、蜥蜴等等。那么我到宠物店说“请给我一只宠物”,服务员给我小猫、小狗...博文来自:ogog123的博客

  多态:同样的引用调用同样的方法却做了不同的事情。概述:在设计一个方法时,通常希望该方法具备定的通用性。例如要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当...博文来自:的博客

  目录一、多态的表现形式二、重载和重写的简单介绍1.重载(overload)2.重写(override)三、向上转型和向下转型的简单介绍1.向上转型2.向下转型四、在多态中方法的调用机制五、实例的分析1...博文来自:elice_的博客

  Java多态的底层原理Java后端开发者公众号:程序之心(ID:chengxuzhixin)​关注他4人赞了该文章作为一门面向对象语言,Java拥有封装、继承、多态三大特性。多态就是允许不同类的对象对...博文来自:xinzhou201的专栏

  什么是多态?所谓多态,是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调...博文来自:Jack

  多态(polymorphism):在执行期间(而非编译器)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。由于是在运行期的动态实现,直到new出对象才能确定具体调用的哪个方法,因此多态又叫...博文来自:飘落客

  面向对象编程有三个特点:继承、多态、封装。 说道多态,其实又是和继承分不开的。所以,先简单说一下继承吧。继承的概念中又有两个重要概念:父类和子类。一个类就是一种类型,子类继承了父类的所有特征,与此同时...博文来自:huangxun08的专栏

  多态性是指统一的接口,不同的表现形式。在我们下面的例子中,有5个类。Game类是Football、Basketball、Popolong的父类,Games类使用前面4个类。Java根据动态绑定决定执行...博文来自:有趣的英文字母

  个人对Java中多态的部分理解,多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用...博文来自:u013682392的博客

  核心:1、多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底...博文来自:Jian_Yun_Rui的博客

  是一个Java的编程人员就知道,在以后项目开发的时候,我们的多态性几乎天天用。小编和读者今天就来深究一下多态性的一些细节。首先我们要知道多态性的三个必要满足的条件:1.有继承2.有方法的重写3.有父类...博文来自:a907691592的博客

  多态的好处:提高了代码的扩展性,前期定义的代码可以使用后期的内容。多态的弊端:前期定义的内容不能使用(调用)后期子类的特有内容。多态的前提:1.必须有关系,内容,实现。2.要有覆盖。......博文来自:兔老大的胡萝卜

  1、面向对象的三大基本特征:封装、继承、多态2、多态是指:父类引用指向子类对象,在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。3、实现多态的三要素:继承重写父类引用指向子类对象...博文来自:jack_shuai的博客

  java多态性多态分两种:(1)  编译时多态(设计时多态):方法重载。(2)  运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事...博文来自:大鱼大鱼吃小鱼

  Java引用变量类型,什么是多态,多态产生的必要条件,向上转型等博文来自:Leeon的博客

  “ 时针如果可以回头,熟悉那张脸,重温嬉戏这乐园,墙壁的松脱涂鸦已经褪色才明白存在的价值归于记忆。街角小店尚存在吗?这大时代会不会牵挂,过去现在花开怎么会等待。     但有种意外不管痛不...博文来自:黑夜骑士

  面向对象编程有四个特征:抽象、封装、继承、多态。多态有四种体现形式:1、接口和接口的继承2、类和类的继承3、重载4、重写其中重载和重写为核心:重载:发生在同一个类中,在该类中如果存在多个同名方法,但是...博文来自:u014036315的博客

  0.前言多态在Java技术里有很重要的地位,在面试中也会经常被问到。但是多态太抽象了,查了很多很多资料,连续几天断断续续的看,有时候看着看着就走神了。毕竟太抽象,哈哈~不过依然硬着头皮看下来了(也不知...博文来自:SEU_Calvin的博客

  详细见菜鸟教程:前言多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实...博文来自:dpl12的博客

  this: 最终子类的地址super:每一层的父类所以不管每一层的this都是指向最下层子类,如果找不到方法就去上找,直到找到方法publicclassTest{  publicstaticvoidm...博文来自:笑傲江湖的博客

  成员变量:    当子父类中出现同名的成员变量时。    编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。    运行时期:也是调用引用型变量所属的类中的成员变量。   ...博文来自:乔培宸的博客

  封装、继承、多态是面向对象的三大特征,在Java中什么是多态?Java引用变量有两种类型,分别是编译时类型和运行时类型。何为编译时类型,编译时类型就是由声明该变量时使用的类型决定,而运行时类型是由实际...博文来自:LOU的专栏

  /*对象的多态性:动物x=new猫();函数的多态性:函数重载、重写1、多态的体现父类的引用指向了自己的子类对象父类的引用也可以接收自己的对象2、多态的前提必须是类与类之间只有关系,要么继承或实现...博文

  1.是什么多态从字面意义来说就是“多种状态”,在java中指的是允许同一函数对不同类的对象作出响应。2.为什么多态能够消除方法跟类之间的耦合,具体来说就是能够把不同的子类对象都当作父类来看,可以屏蔽不...博文来自:oxiangyao的博客

  多态理解多态:一种事物有多种表现形式。面向对象的最后一个特征,继承和封装都是为多态打基础!生活中的多态:打招呼:中国人:你好英国人:hello日本人:拷逆七娃韩国人:阿娘哈赛you泰国人:萨瓦迪卡多态...博文来自:张鑫的博客

  向上转型:将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换  用法: Fatherf=newSon();向下转型:子类引用指向父类引用的子类对象 通俗的说就是子类实例对象赋值给父类引用...博文来自:Gorden的博客

  java多态的实现原理有2种方式来实现多态,一种是编译时多态,另外一种是运行时多态;编译时多态是通过方法的重载来实现的,运行时多态是通过方法的重写来实现的。方法的重载,指的是同一个类中有多个同名的方法...博文来自:jcsyl_mshot的博客

  前言:最近工作因需要,过了一遍java基础。发现了一个有趣的东西。正文:java中的多态跟Python中的多态是有区别的。总感觉python中的多态多少有点牵强。java中的多态定义:多态存在的三个必...博文来自:u012762054的博客

  面向对象的三大特征:1.封装2.继承。3.多态多态:一个对象具备多种形态。(父类的引用类型变量指向了子类的对象)或者是接口的引用类型变量指向了接口实现类的对象多态的前提:必须存在继承或者实现关系。  ...博文来自:oguro的博客

  隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价...博文来自:dragon的专栏

  连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为...博文来自:Napoleon的专栏

  ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的,功能丰富的加密IC,使用SHA-256算法进行加密操作,内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥,唯一的9字节...博文来自:a5882230的专栏

  一个例子高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一...博文来自:小平子的专栏

  利用CRC32绕过RAR密码(适合于小文本文件)原文标题:教你绕过rar密码 文章仅作rar密码破解的探讨,如有高见还望提出。 题目有点夸大其词,事实是我也没能想出一个更好的描述来总结这篇文...博文来自:林毅洋

  一、适用场景内存属于稀缺资源,不能随意浪费。如果在一个系统中有很多个完全相同或相似的对象,我们就可以使用享元模式,让他们共享一份内存即可,不必每个都去实例化对象,从而节省内存空间。二、模式核心 享...博文来自:小小本科生成长之路

  原文地址:因为需要用,所以才翻译了这个文档。但总归赖于英语水平很有限,翻译出来的中文有可能...博文来自:ymj7150697的专栏

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...博文来自:杨威的博客

  转载请说明原出处,谢谢~~   第三个没有做的是每个显示的背景图的小图的动态外观,原酷狗的背景图的小图标,有normal、hover、down等 多种状态,如图  ...博文来自:Redrain的专栏

  转载请注明出处:     在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容。 公交信息检索     实际上,公交信息检索与POI检索、在线建议检索非常相似,也...

  一、前言最近由于研究需要,要用到线性判别分析(LDA)。于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然开...

  1.当我们发现无法联网时,我们运行下面命令或者ping命令 ip  addr 结果没有显示局域网的IP地址 2.我们去修改网卡配置文件,把网络连接打开 cd / cd  /etc/sys...

  本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框、发评论,及弹出位置的控制。...

  在最近的项目开发中涉及到一个伴奏和类似K歌的功能,最明显的做法就是将播放器里播放的声音扑捉到缓冲区里与麦克风的声音做混合,然后编码发送出去。这里有个关键环节就是混音。因为是音乐类的声音混合,所以要求尽...

  单机最大的TCP连接数及其修改 一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535” .    65535这个数字的由来,很多人想当然地将它与port最大值联系起来。的确,TCP的...

  田发江的专栏微信支付V3微信公众号支付PHP教程(thinkPHP5公众号支付)/JSSDK的使用

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...

  jquery/js实现一个网页同时调用多个倒计时(最新的)11-25阅读数 51万+

  深入理解在Android中线天的凌晨时光,这段时间收获很多.(2)从整理文章,作者从线程--阻塞队列--二进制--线程池的内部机制,一路走来,本来是想写一篇为AsyncTask...博文来自:我一直很棒,这个不用质疑

  1、点击打开遮罩层按钮 2、弹出一个隐藏的div 实现代码如下: 影音先锋 -- ...博文来自:简单就是美

  PHP如何获取刚插入数据的ID 和判断SQL语句是否成功执行博文来自:coder_zyz的专栏

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  command窗口是命令窗口,即为sqplus窗口,有命令提示符,识别sqlplus命令,基本的命令都可以执行 sql仅可执行DDL、select、DML等...博文来自:Ape55的博客

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...博文来自:知识小屋

  自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。 1. 测试集和训练集3、7分组 australian ...博文来自:Tiaaaaa的博客

本文链接:http://chapmanswifts.com/duotailuoji/343.html