**
多态
**
多态前提:父类引用指向子类对象,再调用父类的方法,却下沉到对应子类执行不同的操作,从而表现出多种形态,多态。
三种情况:
1,父类作为方法形参,实参传不同的子类,执行子类重写后的方法
2,父类作为数据类型,创建不同子类,执行子类重写后的方法
3,父类作为方法返回值,实际返回子类对象,执行子类重写后的方法
package com.fage;
/**
* @author Mr.Gao
* @version 1.0
* @date 2021/3/17 22:28
*/
public class Demo04 {
public static void main(String[] args) {
Jian jian = new Jian();
fun(jian);
Dao dao = new Dao();
fun(dao);
}
// 使用多态的方法
public static void fun(WuQi wuQi) {
//调用子类中重写的方法
wuQi.hit();
//判断一下类型
//根据具体的类型进行向下转型
//判断 wuQi 是否属于 剑(类名)这个类的对象
if (wuQi instanceof Jian) {
//改武器就是一把剑
//向下转型
Jian j=(Jian)wuQi;
//调用特有的方法
j.LianJian();
}else if (wuQi instanceof Dao) {
Dao d= (Dao)wuQi;
d.LianDao();
}
}
}
class WuQi {
public void hit() {
System.out.println("武器打");
}
}
class Jian extends WuQi {
@Override
public void hit() {
System.out.println("剑-- 舞衣下");
}
public void LianJian() {
System.out.println("练习剑法");
}
}
class Dao extends WuQi {
@Override
public void hit() {
System.out.println("砍人");
}
public void LianDao() {
System.out.println("练习刀法");
}
}
public class Demo07 {
public static void main(String[] args) {
TieTong tieTong = new TieTong();
tieTong.setBlood(200);
hiJiang(tieTong);
}
public static void hiJiang(JiangShi jiangShi) {
jiangShi.hit();
}
}
class JiangShi {
// 成员变量私有化
private int blood;
// 无参 有参
public JiangShi(int blood) {
super();
this.blood = blood;
}
public JiangShi() {
super();
// TODO Auto-generated constructor stub
}
public void hit() {
System.out.println("僵尸被人殴打");
}
// set get 方法
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
@Override
public String toString() {
return "Jiang [blood=" + blood + "]";
}
}
class TieTong extends JiangShi {
// 被打方法重写
@Override
public void hit() {
while (true) {
//判断血量
if (this.getBlood() <= 0) {
System.out.println("铁桶僵尸死了");
break;//结束
}
//一次2滴血
this.setBlood(this.getBlood() - 2);
System.out.println("僵尸剩余血量" + this.getBlood());
}
}
}