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. Windows中的txt文件到Mac打开是乱码 解决办法

    在Mac下打开“文本编辑”程序之后,选择菜单“文本编辑” -> “偏好设置”.2)在“偏好设置”中选择第二个标签页“打开和存储”,选择“纯文本文件编码”中的“打开文件”和“存储文件”修改成为“中 ...

  2. linux/ubuntu 取色工具gpick

    命令行方式安装: sudo apt-get install gpick 安装完成以后,在终端窗口中输入: gpick 即可以启动工具

  3. LeetCode 691. Stickers to Spell Word

    原题链接在这里:https://leetcode.com/problems/stickers-to-spell-word/ 题目: We are given N different types of ...

  4. contest3 CF994 div2 ooxxx? oooox? ooooo?

    题意 div2 C (x)(o) 在一个平面上, 给一个水平的正方形和一个\(45^.斜\)的正方形 求是否相交(共点也算), 坐标正负\(100\)以内 div2 D (x)(o) \(A,B\)两 ...

  5. 网络协议 4 - 交换机与 VLAN:拓扑结构

    上一次,我们通过宿舍联网打魔兽的需求,认识了如何通过物理层和链路层组建一个宿舍局域网.今天,让我们切换到稍微复杂点的场景,办公室.     在这个场景里,就不像在宿舍那样,搞几根网线,拉一拉,扯一扯就 ...

  6. Glimma 包

    http://master.bioconductor.org/packages/3.9/bioc/html/Glimma.html 安装 if (!requireNamespace("Bio ...

  7. 一些树上dp的复杂度证明

    以下均为内网 树上染色 https://www.lydsy.com/JudgeOnline/problem.php?id=4033 可怜与超市 http://hzoj.com/contest/62/p ...

  8. Maven私服配置Setting和Pom文件

    上一遍博客已经在linux服务器上,搭建好nexus私服了 现在就需要配置setting.xml和pom.xml来使nexus作为maven的私服.setting.xml文件在conf下面,pom.x ...

  9. Spring JDBC最佳实践(2)

    原文地址:https://my.oschina.net/u/218421/blog/38576 使用DataSourceUtils进行Connection的管理由上节代码可知,JdbcTemplate ...

  10. flume安装使用+根据数据源分类

    安装搭建: 1)解压下载的flume(安装jdk1.6及其以上) 2)在conf文件夹里面建立example.conf文件 #example.conf:单节点Flume配置 #命名Agent a1的组 ...