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. VUE的element-ui的使用

    我们在自己的网站当中有的时候会用到element-ui的组建 1.如何安装element-ui的组件 在命令行工具当中输入cnpm i element-ui -S, 等待安装 2.如何在vue当中使用 ...

  2. css字体名称中英文对照表

    华文细黑:STHeiti Light [STXihei] 华文黑体:STHeiti 华文楷体:STKaiti 华文宋体:STSong 华文仿宋:STFangsong 俪黑 Pro:LiHei Pro ...

  3. HTML基础一-html、CSS

    一.HTML标签 前端语言 HTML-将页面展现出来    CSS-修饰前端标签 让HTML更好看 css 对html 进行修饰    JS-能够让页面动起来 HTML htyper text mar ...

  4. hadoop java.io.EOFException: Unexpected end of input stream

    执行hadoop 报错 java.io.EOFException: Unexpected end of input stream at org.apache.hadoop.io.compress.De ...

  5. LeetCode 528. Random Pick with Weight

    原题链接在这里:https://leetcode.com/problems/random-pick-with-weight/ 题目: Given an array w of positive inte ...

  6. django @login_required登录限制

    参考文章:https://www.cnblogs.com/wodekaifalog/p/10817275.html 我们在网站开发过程中,经常会遇到这样的需求: 用户登陆系统才可以访问某些页面 如果用 ...

  7. ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)

    IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...

  8. maker使用说明书

    1.以自带的示例数据为例 dpp_contig.fasta dpp_est.fasta dpp_protein.fasta te_proteins.fasta 2.生成控制文件 控制文件是特定于运行的 ...

  9. OD(lfdnb)

    由于一场意外,D死了,在此开一个新坑 2019.11.13 考前焦虑 智商为负 有点担心考试状态 2019.11.12 上午考试简直心态爆炸 T1看了一个小时不会 然后看T2,这时候wxy聚聚已经切了 ...

  10. C语言之symlink

    函数原型: #include <unistd.h> int symlink(const char * oldpath, const char * newpath); 函数说明: symli ...