精华内容
下载资源
问答
  • 本篇文章给大家带来的内容是什么是java多态?java多态的使用,通过游戏中的一些功能带你掌握多态的使用。下面由动力节点java学院小编为大家一一介绍什么是java多态java多态的使用。希望对大家有帮助。为什么要使用...

    本篇文章给大家带来的内容是什么是java多态

    ?java多态的使用,通过游戏中的一些功能带你掌握多态的使用。下面由动力节点java学院小编为大家一一介绍什么是java多态及java多态的使用。希望对大家有帮助。

    为什么要使用多态

    在一款对战类游戏中(如有雷同纯属巧合),有两个不同的法师英雄:小乔、妲己。

    两个法师英雄的都有攻击的方法,小乔的攻击伤害为10,消耗魔法20。妲己的攻击伤害为15,消耗魔法30。玩家可以操作两个英雄进行攻击,下面看看实现的代码。

    父类-英雄:whyusepolymorphic.Hero.java

    9cae221dcfaf57d0dd90337801cca945.png

    子类-小乔:whyusepolymorphic.LittleJoe.java

    b877aacf29d1723c73a2bfe8288a56d1.png

    子类-妲己:whyusepolymorphic.Daji.java

    33a6426838583957e93eb41ac28970b6.png

    玩家:whyusepolymorphic.Player.java

    361a6136fc2dd9c18932b6fbc89f1ea2.png

    上面代码完整的实现了要求中的功能,那我们知道英雄不可能就这几个,后期如果添加新的魔法英雄,伤害不一样,怎么办?

    我们可以添加新的类,实现攻击的方法,修改玩家类添加操作英雄的方法。这个方式可以完成 Hero 扩展的需求,但是后面有更多的 Hero

    添加进来,我们维护起来就不是那么方便了。

    研究上面的代码我们发现,Player 类中的 play 方法的参数都是 Hero 类的子类,能否使用一个 play(Hero hero)

    方法操作所有的英雄?使用多态就能够实现这种优化设计。

    什么是多态

    简明扼要,多态就是多种形态。在自然界中碳的多态就有石墨、钻石等,剪这个动作就有剪纸、剪头发等。同一个操作,由于条件的不同,产生的结果也不同。

    那么在程序中的多态,就是指同一个引用类型,使用不同的实例而执行不同的操作(父类引用指定子类对象 Hero h=new Daji();)。

    如何实现多态

    实现多态的步骤:

    1.编写具有继承关系的父类和子类

    2.子类重写父类方法

    3.使用父类的引用指向子类的对象

    父类作为方法形参实现多态

    使用多态优化上面代码

    修改 Hero.java 添加攻击的方法

    0bc19169b4aea282781f7a5b5df27af5.png

    两个子类不用修改

    修改玩家类 Player.java 将 play方法的参数设为父类

    f63ed949e546f0aec7843534e50dc5bf.png

    修改测试类

    2cce9e686c96e87904d06c4634386ceb.png

    父类作为返回值实现多态

    玩家购买英雄使用多态实现,购买的方法有返回值,返回购买后的英雄,父类作为返回值实现这个功能。

    修改玩家类 Player.java 添加获取英雄的方法

    1d24666e10c0c850325ba83bb55e6bdc.png

    测试类

    437c42b4345c1b614b51910d0ed16b72.png

    父类到子类的转换

    如果子类中有一些子类特有的方法,父类引用不能调用子类的特有的方法。

    向 Daji.java 中添加一个方法 queenWorship

    64239c10ceea6b3367aee30a2e6a83ba.png

    向 LittleJoe.java 中添加一个方法 dazzlingStar

    7d6ab287c11e7626faf902918e48b01d.png

    在 Player.java 中添加 bigMove 方法

    23edcd5e850fa9e93ca9f7361cebbddc.png

    发现代码 hero.dazzlingStar(); 报错

    那么这个时候就需要将父类转换为子类(强制类型转换)

    c7f5345fd757e519bf16eb29d36cb38e.png

    但是直接这样写也会报错,用 instanceof 运算符可以保证不会转换错误

    语法:

    1c1b8f70026cdd366ff0986cf90cbea7.png

    instanceof通常和强制类型转换结合使用

    修改 Player.java 中的 bigMove 方法

    5a60a235eb23c9458b0823a22d51e7d0.png

    在 main 方法中编写测试代码

    c251f6ca902ab468e6c76492393d8d2c.png

    以上就是什么是java多态?java多态的使用的详细内容,希望能对大家的学习有所帮助。更多相关内容请关注动力节点java学院官网,每天会有精彩内容等你来看。

    以上内容相关免费视频教程下载:

    展开全文
  • 本篇文章将从贴近生活的案例,来解释什么是多态。多态(阅读以下内容,需要提前了解java继承和接口的知识)再结合案例前,得先知道多态的代码怎么写,以及一些相关规则.具有继承关系的父子类(或者是接口及其实现类),...

    前言

    多态是java学习的重难点,因为其高度抽象性,直接从理论上去理解往往是比较困难的。本篇文章将从贴近生活的案例,来解释什么是多态。

    多态

    (阅读以下内容,需要提前了解java继承和接口的知识)

    再结合案例前,得先知道多态的代码怎么写,以及一些相关规则.具有继承关系的父子类(或者是接口及其实现类),才能用多态.

    格式

    父类名称 对象名 = new 子类名称();//多态写法

    或者

    接口名称 对象名=new 实现类名称();

    通过这个格式new出来的对象,只能访问父类中的成员变量和成员方法,子类独有的成员属性和方法没办法访问.

    接下来看看,直接new一个父类对象,直接new一个子类对象,通过多态new一个对象,三者有什么区别?

    1.直接new一个父类对象A

    对象A只能访问父类中的成员变量和方法,重点:对象A是一个父类对象.

    2.直接new一个子类对象B

    对象B既可以访问子类对象的成员属性和方法,也可以访问父类的。重点:对象B是一个子类对象

    3.通过多态new一个对象C

    只能访问父类中的成员变量和成员方法,重点:此时对象C是一个父类对象,但可以通过向下转型变为子类对象,去访问子类对象的成员属性和方法.

    重点(多态的特点):

    多态对象在创建时是一个父类对象,可以在有需要的时候变成子类对象。也就是说对象C可以在父类对象和子类对象中切换,它拥有多个形态,这就是多态.

    这样做有什么用呢?或者说有什么好处呢?来看案例.

    案例

    每台笔记本上都有usb接口,只需要把usb设备插上去,电脑就可以识别.usb设备有鼠标、键盘、u盘等等.

    用java来模拟上述的事物.

    笔记本类LapTop,拥有一个usb接口方法usbIterface,无成员变量. usbIterface方法需要传入usb设备,如果是你,如何区别不同的usb设备呢?

    新建鼠标类Mouse、键盘类KeyBoard。然后用方法重载?//鼠标类

    public class Mouse {

    public void on(){

    System.out.println("鼠标链接");

    }

    public void click(){

    System.out.println("鼠标点击");

    }

    }

    //键盘类

    public class KeyBoard {

    public void on(){

    System.out.println("键盘连接");

    }

    public void input(){

    System.out.println("键盘输入");

    }

    }

    //笔记本类---方法重载

    public class LapTop {

    public void usbInterface(Mouse mouse){

    mouse.on();

    mouse.click();

    }

    public void usbInterface(KeyBoard keyBoard){

    keyBoard.on();

    keyBoard.input();

    }

    }

    这样做虽然可以,但是当usb设备变多,代码就会过度冗余。此时就需要用到多态了。

    还记得上文说的,所有采用多态格式new出来的对象,都是父类对象吗?只需要让鼠标、键盘都继承同一个父类,那么就是可以把不同的usb设备传入到一个函数中,该函数只需要接受同一个父类对象.

    新建usb设备类,让鼠标和键盘继承.鼠标和键盘类都有on方法,可以抽取到父类中.//usb设备类

    public classUsbDevice {

    public void on(){

    System.out.println("usb设备连接");

    }

    }

    //鼠标类

    public class Mouse extendsUsbDevice {

    public void click(){

    System.out.println("鼠标点击");

    }

    }

    //键盘类

    public class KeyBoard extendsUsbDevice {

    public void input(){

    System.out.println("键盘输入");

    }

    }

    //笔记本类

    public class LapTop {

    public void usbInterface(UsbDevice usb){

    usb.on();

    }

    }

    实例public class Main {

    public static void main(String[] args) {

    //new一个笔记本对象

    LapTop lapTop=new LapTop();

    //多态方式new一个鼠标对象

    UsbDevice mouse= new Mouse();

    //多态方式new一个键盘对象

    UsbDevice keyBoard=new KeyBoard();

    //将鼠标键盘插入到usb接口上

    lapTop.usbInterface(mouse);

    lapTop.usbInterface(keyBoard);

    }

    }

    当usb设备插入到usb接口后,需要判断是什么设备,然后使用该设备的特有方法。这就需要使用多态的向下转型,将父类对象转为子类对象.

    格式:

    子类名称 对象名=(子类名称)原来多态对象名

    在向下转型前,得先判断多态对象的多种形态中是否有对应的子类对象,有才可以转,mouse对象只能转鼠标,不能转键盘,这就需要用到instanceof关键字.

    格式:

    多态对象名instanceof需要转换的子类名称//笔记本类

    public class LapTop {

    public void usbInterface(UsbDevice usb){

    usb.on();

    //判断是否包含鼠标这个形态

    if (usb instanceof Mouse){

    Mouse mouse=(Mouse)usb; //向下转型

    mouse.click();//调用鼠标特有功能

    }

    //判断是否包含键盘这个形态

    else if(usb instanceof KeyBoard){

    KeyBoard keyBoard=(KeyBoard)usb; //向下转型

    keyBoard.input();//调用键盘特有功能

    }

    else{

    System.out.println("无法识别的usb设备");

    }

    }

    }

    198653738_1_2020080801320753_wm

    总结

    如果有新的设备需要插入usb接口,只需要让这个设备去继承usb设备类,那么新设备就会被当做usb设备.这就是多态的好处.

    多态本身是一种向上转型(因为通过多态new出来的对象,会被看作一个父类对象),可以通过向下转型变为子类对象.END

    主  编   |   王文星

    责  编   |   木有符号where2go 团队微信号:算法与编程之美

    展开全文
  • Java面向对象程序设计 多态 主讲人何鑫 软件技术专业教学资源库 什么是多态 第二部分 什么是多态 多态是具有表现多种形态的能力特征即同一个实现接口引用类型使用不同的实例而执行不同操作 也可理解为相同的消息给予...
  • 展开全部多态(Polymorphism)按字面的意思就是“多种...引用Charlie Calverts对多态的描述——多态性允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象...

    展开全部

    多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实32313133353236313431303231363533e58685e5aeb931333366306538现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,

    父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。

    多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。

    运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。

    多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

    C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。

    OC中的多态:不同对象对同一消息的不同响应.子类可以重写父类的方法

    多态就是允许方法重名 参数或返回值可以是父类型传入或返回。

    4c9c674d8fb786e39dc7735a36ffd33b.png

    扩展资料:

    把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

    赋值之后,父类型的引用就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。

    比如从某个基类派生出多个子类,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子类对象中的任何一个可以赋给其基类对象的引用,或者说将子对象地址赋给基类指针,这样其基类的对象就可以执行不同的操作了。

    实际上你是在通过其基类的引用来访问其子类对象的,你要做的就是一个赋值操作。

    使用继承性的结果就是当创建了一个类的家族,在认识这个类的家族时,就是把子类的对象当作基类的对象,这种认识又叫作upcasting(向上转型)。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,

    因为编译器会自动找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。

    展开全文
  • 什么是多态JAVA 中多态 方法必须要被所在类或对象调用才有意义 若方法含有参数: 形参:方法声明时的参数。 实参:方法调用时实际传给形参的参数值。 JAVA里将实参数值传入方法的传递机制只有 值传递 在值...

    什么是多态,JAVA 中多态的实现机制

    首先声明啊,这里的多态不是生物学和物理学上的多态性,这个是指编程语言中的多态。

    官方说明:

    • 多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口.
    • 多态是允许你将父对象设置成为一个或更多的他的子对象相等的技术。
    • 我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。

    看完是不是很懵逼?

    懵逼
    说人话就是:

    允许将子类类型的指针赋值给父类类型的指针,把不同的子类对象都当作父类来看。就比如你在一个京剧世家,有人邀请你们家出个人来唱一出戏,邀请函上写的是你父亲的名字,但很不凑巧你父亲病了,你只能穿上你父亲的戏服,装作你父亲去登台唱戏。台下的人只知道是你们家的人登台,可能你父亲,也可能是你家人代替你父亲。你为了不被发现是代替你父亲,你就要隐藏起来其他技能。这就是多态。


    多态又分为 编译时多态和运行时多态:

    • 编译时多态(静态):重载
    • 运行时多态(动态):重写

    演示代码如下:

     public class Father {	//父类
    
        void sing (){
            System.out.println("我是爸爸,我会唱京剧" + "\n");
        }
    }
    
    class Son extends Father{	//子类,继承父类
        void sing (){
            System.out.println("我是儿子,我会唱京剧" + "\n");
        }
    
        void kungFu (){
            System.out.println("我是儿子,我会武术" + "\n");
        }
    }
    
    class test{	//测试类
        public static void main(String[] args) {
            Father father = new Son();		//多态的表现
            father.sing();
        }
    }  
    

    在使用 “father.” 调用方法时能发现,弹出的方法里根本没有Son类的kungFu方法:
    方法提示框
    运行结果如下:
    结果
    儿子:嘻嘻,没被发现,装父亲成功了!
    描述


    扩展

    1.多态的实现机制

    术语版本:
    我们将引入Java静态分派和动态分派这个概念。

    • 静态分派:所有依赖静态类型来定位方法执行版本的分派动作。静态分派发生在编译阶段,因此确定静态分派的动作实际上不是由虚拟机来执行的,而是由编译器来完成。(编译时多态)
    • 动态分派:在运行期根据实际类型确定方法执行版本的分派动作。(运行时多态)

    简单版本:
    原理也很简单,父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,由于程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定。所以这个对象的方法是运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。

    如果想深入的同学可以参考可以参考《深入理解Java虚拟机》。

    2.里氏代换原则

    里氏代换原则(LSP): 子类对象能够替换父类对象,而程序逻辑不变。

    里氏替换原则有至少以下两种含义:

    1. 里氏替换原则是针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,不能被子类重新定义。子类只能通过新添加方法来扩展功能,父类和子类都可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑和父类一致的方法,这时用子类对象将父类对象替换掉时,当然逻辑一致,相安无事。
    2. 如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合LSP,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类就是不能实例化,所以也不存在可实例化的父类对象在程序里。也就不存在子类替换父类实例(根本不存在父类实例了)时逻辑不一致的可能。不符合LSP的最常见的情况是,父类和子类都是可实例化的非抽象类,且父类的方法被子类重新定义,这一类的实现继承会造成父类和子类间的强耦合,也就是实际上并不相关的属性和方法牵强附会在一起,不利于程序扩展和维护。

    如何符合LSP?总结一句话 —— 就是尽量不要从可实例化的父类中继承,而是要使用基于抽象类和接口的继承。


    如有问题欢迎指正
    参考:
    https://blog.csdn.net/sunxianghuang/article/details/52280002
    https://www.zhihu.com/question/27191817/answer/145013324

    展开全文
  • 学习java刚刚入门的小伙伴们,不知道大家在初次接触java中的多态一概念的时候,是否能清晰的讲出实现多态的机制是什么吗?什么是java中的多态呢?多态性指的面向对象程序设计代码重用的一个重要的机制,对于Java多...
  • Java多态今天来谈谈Java中的多态,作为面向对象的一大特性,它的重要性不必多说,相比其他两特性(继承、封装)从字面上看就有点不易读懂,多种态度还是有多变态?官解官方解释:多态是同一个行为具有多个不同表现形式...
  • 面向对象编程有三大特性:封装、继承、多态。封装隐藏了类的内部实现机制,可以在不影响使用的...那么什么是多态呢?多态的实现机制又是什么?请看我一一为你揭开:所谓多态就是指程序中定义的引用变量所指向的具...
  • 多态 java_多态Java

    2021-03-05 14:26:33
    一、多态1、什么是多态?解析:不同的对象对于同一个操作,做出的响应不同具有表现多种形态的能力的特征2、使用多态的优点解析:为了实现统一调用一个小例子:父类(Pet) 子类(Gog,Penguin) 主人类(Master)测试类(Test...
  • 什么是多态

    2020-10-23 19:56:46
    什么是多态 Java是面向对象的bai语言,多态性是面du向对象程序设计代码重用的一zhi个最强大机制,动态性的概dao念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行...
  • 多态 Java

    千次阅读 2019-04-20 19:37:42
    什么是多态 生活中: 同一个动作在不同环境下表现出来的不同状态 Java中: 同一个方法在不同的对象中体现出来不同的状态 内存中: 父类引用指向子类对象 多态实现的必要条件 1.存在继承关系 2.存在方法重写 3.父类...
  • 多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能创建可扩展的程序,无论在项目最初还是添加新功能的时候都可“生长”的程序。简单的来说多态就是将...
  • 多态 JAVA

    2016-05-28 23:01:00
    1、什么是多态? 不同的对象对于同一个操作,做出的响应不同 具有表现多种形态的能力的特征 2、使用多态的优点 : 为了实现统一调用 二、子类到父类的转换(向上转型) ① 将一个父类的引用指向一个子类对象...
  • Java而言,当有人问道:什么是多态?很多人就会说多态的概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。Java中,什么是多态?...
  • 知识点:多态的概念、java中多态的使用(方法重载和重写、子类对象的多态性) 、多态使用的好处一:什么是多态一种事物的多种存在形态,比如说男人和女人都是人,人可以分为男人和女人二:java中多态的使用场景(1)方法...
  • Java什么是多态

    2020-07-28 00:50:43
    什么是多态? ​ 类型的引用指向子类型的对象。
  • 多态多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。那么怎么理解这句话呢?我们假设有基类Animal,两个Animal的派生类Cat和Dog。我现在有块广告牌,想要...
  • 面试官:什么是多态呢?猪队友:多种形态,气体,液体,固体~面试官:go out! now!到底什么是多态呢?官方说:接口的多种不同的实现方式即为多态。多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术...
  • Java中的多态:什么是多态? 多态性是面向对象编程的三大重要特征之一,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中...
  • JAVA 什么是多态?

    千次阅读 2019-05-16 17:53:28
    面向对象编程有三大特性:封装、继承、多态。 封装隐藏了类的内部实现机制,可以在不影响使用的情况下...那么,什么是多态呢? 1.定义: 多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象...
  • 用最简单的一句话就是:父类型的引用指向子类型的对象。...首先讲下封装和继承:封装把过程和数据包围起来,对数据的访问只能通过已定义的界面,他把实现的细节影藏起来了,比如你在java中去实现...
  • 如果非要用专业术语来描述什么是多态的话多态是指程序中定义的引用变量所指向具体类型和通过该引用变量发出的方法调用在编译的时候并不确定,而是程序运行期间才确定,就是说一个引用变量到底指向哪一个类的实例对象...
  • 多态向上转型直接赋值法方法传参法方法返回向下转型方法重写super 关键字理解多态 承接上篇 链接: link. 向上转型 通常我们在实例化对象的时候都通过new关键字来做的,来调用类内的方法。 public class Main { ...
  • 接口的多种不同的实现方式即为多态。2.多态性允许你将父类对象设置成为一个或更多的他的子对象相等的技术。3.我们在程序中定义的引用变量所指向的具体类型和通过改引用变量的方法调用在编程的时候并不确定,相当于...
  • title: Java多态 date: 2020-03-24 20:38:04 author: JF blog: https://www.huqifa.com/ tags: - Java categories: - Java Java多态 多态:事物的多种形态。即: 不同的对象收到相同的消息,产生不同的结果。 相同...
  • 那么多态实现的途径和必要条件是什么呢?以及多态中的重写和重载在JVM中的表现怎么样?(若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正)多态多态是同一个行为具有多个不同表现形式或形态的能力。举个...
  • 这就是多态的思想,跟我们数学中输入不同数字到公式中产出不同结果一个道理。下面我们就多态的定义、说明进行讲解,通过实例运行,找寻多态的使用注意点和优缺点。一、定义多态是指的事物的多种状态,同一操作,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,111
精华内容 2,444
关键字:

什么是多态java

java 订阅