Java的多态

操作符的多态

+可以作为算数运算,也可以作为字符串连接

类的多态

父类引用指向子类对象

示例 1 : 操作符的多态

同一个操作符在不同情境下,具备不同的作用

如果+号两侧都是整型,那么+代表 数字相加

如果+号两侧,任意一个是字符串,那么+代表字符串连接

package charactor;

public class Hero {
public String name;
protected float hp; public static void main(String[] args) { int i = 5;
int j = 6;
int k = i+j; //如果+号两侧都是整型,那么+代表 数字相加 System.out.println(k); int a = 5;
String b = "5"; String c = a+b; //如果+号两侧,任意一个是字符串,那么+代表字符串连接
System.out.println(c); } }

示例 2 : 观察类的多态现象

观察类的多态现象:

  1. i1和i2都是Item类型
  2. 都调用effect方法
  3. 输出不同的结果

多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态

package property;

public class Item {
String name;
int price; public void buy(){
System.out.println("购买");
}
public void effect() {
System.out.println("物品使用后,可以有效果 ");
} public static void main(String[] args) {
Item i1= new LifePotion();
Item i2 = new MagicPotion();
System.out.print("i1 是Item类型,执行effect打印:");
i1.effect();
System.out.print("i2也是Item类型,执行effect打印:");
i2.effect();
} }
package property; public class LifePotion extends Item {
public void effect(){
System.out.println("血瓶使用后,可以回血");
}
}
package property; public class MagicPotion extends Item{ public void effect(){
System.out.println("蓝瓶使用后,可以回魔法");
}
}

示例 3 : 类的多态条件

要实现类的多态,需要如下条件

  1. 父类(接口)引用指向子类对象
  2. 调用的方法有重写

那么多态有什么作用呢? 通过比较不使用多态与使用多态来进一步了解

示例 4 : 类的多态-不使用多态

如果不使用多态,

假设英雄要使用血瓶和魔瓶,就需要为Hero设计两个方法

useLifePotion

useMagicPotion

除了血瓶和魔瓶还有很多种物品,那么就需要设计很多很多个方法,比如

usePurityPotion 净化药水

useGuard 守卫

useInvisiblePotion 使用隐形药水

等等等等

package charactor;

import property.LifePotion;
import property.MagicPotion; public class Hero {
public String name;
protected float hp; public void useLifePotion(LifePotion lp){
lp.effect();
}
public void useMagicPotion(MagicPotion mp){
mp.effect();
} public static void main(String[] args) { Hero garen = new Hero();
garen.name = "盖伦"; LifePotion lp =new LifePotion();
MagicPotion mp =new MagicPotion(); garen.useLifePotion(lp);
garen.useMagicPotion(mp); } }

示例 5 : 类的多态-使用多态

如果物品的种类特别多,那么就需要设计很多的方法

比如useArmor,useWeapon等等

这个时候采用多态来解决这个问题

设计一个方法叫做useItem,其参数类型是Item

如果是使用血瓶,调用该方法

如果是使用魔瓶,还是调用该方法

无论英雄要使用什么样的物品,只需要一个方法即可

package charactor;

import property.Item;
import property.LifePotion;
import property.MagicPotion; public class Hero {
public String name;
protected float hp; public void useItem(Item i){
i.effect();
} public static void main(String[] args) { Hero garen = new Hero();
garen.name = "盖伦"; LifePotion lp =new LifePotion();
MagicPotion mp =new MagicPotion(); garen.useItem(lp);
garen.useItem(mp); } }

练习Java的多态

  1. 设计一个接口

    接口叫做Mortal,其中有一个方法叫做die

  2. 实现接口

    分别让ADHero,APHero,ADAPHero这三个类,实现Mortal接口,不同的类实现die方法的时候,都打印出不一样的字符串

  3. 为Hero类,添加一个方法,在这个方法中调用 m的die方法。

    public void kill(Mortal m)

  4. 在主方法中

    首先实例化出一个Hero对象:盖伦

    然后实例化出3个对象,分别是ADHero,APHero,ADAPHero的实例

    然后让盖伦 kill 这3个对象

Java自学-接口与继承 多态的更多相关文章

  1. Java自学-接口与继承 接口

    设计Java的接口 在设计LOL的时候,进攻类英雄有两种,一种是进行物理系攻击,一种是进行魔法系攻击 这时候,就可以使用接口来实现这个效果. 接口就像是一种约定,我们约定某些英雄是物理系英雄,那么他们 ...

  2. Java自学-接口与继承 抽象类

    Java 抽象类 在类中声明一个方法,这个方法没有实现体,是一个"空"方法 这样的方法就叫抽象方法,使用修饰符"abstract" 当一个类有抽象方法的时候,该 ...

  3. Java自学-接口与继承 对象转型

    Java中的对象转型 示例 1 : 明确引用类型与对象类型的概念 首先,明确引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是A ...

  4. Java自学-接口与继承 UML图

    UML 图 步骤 1 : UML 图 -- 类之间的关系 UML-Unified Module Language 统一建模语言,可以很方便的用于描述类的属性,方法,以及类和类之间的关系 步骤 2 : ...

  5. Java自学-接口与继承 默认方法

    默认方法 步骤 1 : 什么是默认方法 默认方法是JDK8新特性,指的是接口也可以提供具体方法了,而不像以前,只能提供抽象方法 Mortal 这个接口,增加了一个默认方法 revive,这个方法有实现 ...

  6. Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接在 ...

  7. Java自学-接口与继承 final

    Java的修饰符final final修饰类,方法,基本类型变量,引用的时候分别有不同的意思. 示例 1 : final修饰类 当Hero被修饰成final的时候,表示Hero不能够被继承 其子类会出 ...

  8. Java自学-接口与继承 Object类

    Java中的超类 Object 步骤 1 : Object类是所有类的父类 声明一个类的时候,默认是继承了Object public class Hero extends Object package ...

  9. Java自学-接口与继承 重写

    Java 重写方法 子类可以继承父类的对象方法 在继承后,重复提供该方法,就叫做方法的重写 又叫覆盖 Override 步骤 1 : 父类Item 父类Item有一个方法,叫做effect packa ...

随机推荐

  1. ubuntu无法连接网络

    一,先说一下VMware软件和linux镜像的版本: VMware Workstation 14 Pro ubuntu-14.04.6-desktop-amd64.iso 二,遇到的问题 在第一次安装 ...

  2. HTTP协议的异步通信

    get 请求 1)创建一个XMLHttpRequest对象 2)调用该对象的open方法 3)如果是get请求,设置回调函数onreadystatechange = callback 4)Send 如 ...

  3. npm和yarn的淘宝镜像添加

    https://www.cnblogs.com/demonrain/p/8568122.html npm config set registry https://registry.npm.taobao ...

  4. 产品上线后,出现BUG的处理流程

    根据bug的大小,如果影响业务逻辑及用户提醒及时处理,如果只是一些状态.文案等等对业务无重大影响可以跟版本迭代走 很严重的bug必然要回滚,想都不要想赶紧去着手安排做. 检查回滚版本是否会丢失数据,如 ...

  5. 自用ftp上传脚本

    #!/bin/sh backupserver=$1 #localdir=ftp_result_tmp username=$3 password=$4 #remodir='./Log/2018-01-2 ...

  6. django-debug-toolbar调试请求接口

    第一步: pip install django-debug-toolbar 安装完成,往下继续配置. 第二步: 打开项目,找到settings.py 文件.  找到: INSTALLED_APPS-- ...

  7. Qt常用类——Qstring

    Qstring有一些方面跟C/C++中的string的使用,例如把一个字符串追加到另一个字符串中,也是用“+”.也有append函数等. 下面是是Qstring的一些常用的具体函数示例: Qt的QSt ...

  8. 转载:cnn学习之卷积或者池化后输出的map的size计算

    相信各位在学习cnn的时候,常常对于卷积或者池化后所得map的的大小具体是多少,不知道怎么算.尤其涉及到边界的时候.   首先需要了解对于一个输入的input_height*input_widtht的 ...

  9. java线程池源码的理解

    线程池 新建线程和切换线程的开销太大了,使用线程池可以节省系统资源. 线程池的关键类:ThreadPoolExecutor. 该类中包含了大量的多线程与并发处理工具,包括ReentrantLock.A ...

  10. CentOS7安装RabbitMQ,并设置远程访问

      如果网速慢 可以直接到百度云分享中下载,然后拉到centerOS中,进行第二步即可    两个人安装包地址,提取码:z1oz 1.安装erlang环境 wget http://www.rabbit ...