一、抽象类
1、引入
// 类中声明一个方法,该方法没有方法体,即“空方法”
// “空方法”,即抽象方法,abstract修饰
// 当一个类有抽象方法时,该类必须声明为抽象类
不是抽象类,报错。
package ia9_abstract;
public abstract class Hero {
protected String name;
protected float hp;
protected int armor;
protected int moveSpeed;
// 抽象类
// 抽象方法,没有方法体
public abstract void attack();
}
2、特点
// 子类必须实现父类抽象方法
package ia9_abstract;
public class ADHero extends Hero implements AD {
@Override
public void phsyicAttack() {
// TODO Auto-generated method stub
System.out.println("进行物理攻击");
}
// 实现父类抽象方法
@Override
public void attack() {
// TODO Auto-generated method stub
phsyicAttack();
}
}
// 抽象类可以没有抽象方法
// 一旦声明为抽象类,不能直接实例化
// Cannot instantiate the type Hero
二、抽象类 VS 接口
// 区别1
// 抽象类,子类只能继承一个抽象类
RealHero只能实现Hero,Item类中的一个
package ia9_abstract2;
public abstract class Hero {
public final static int ItemTotalNumber = 6;
public String name;
float hp;
protected int armor;
private int moveSpeed;
public abstract void attack();
}
package ia9_abstract2;
public abstract class Item {
protected String name;
protected float price;
public void buy() {
System.out.println("买买买");
}
public abstract void effect();
}
// 接口,子类可以实现多个接口
ADAPHero可以实现AD、AP接口
详见链接
https://blog.csdn.net/weixin_41117393/article/details/103677557
// 区别2
// 抽象类,属性可以是public,default,protected,private,static,final中任意一个或多个修饰
如区别1,Hero类属性所示;
// 接口,属性只能是public static final修饰
如下所示,使用其他修饰符将报错。
// Illegal modifier for the interface field AD.i; only public, static & final are permitted
// 区别3
// 抽象类,方法可以是实体方法,抽象方法;
如区别1,Item类所示。有实体方法(有具体实现),有抽象方法(空,无具体实现)
// 接口,方法可以是默认方法(实体方法,与抽象类中实体方法不同),空方法(抽象方法)。
默认方法待解锁,空方法(无具体实现)。
三、练习
// 为Item类设计抽象方法disposable(),返回值为布尔类型;
// LifePotion、MagicPotion、Weapon、Armor分别继承Item类,并实现抽象方法disposable();
// LifePotion、MagicPotion返回true,使用后消失;
Weapon、Armo返回false,武器使用后仍然存在。
我的学习源泉:https://how2j.cn/k/interface-inheritance/interface-inheritance-abstract-class/314.html?p=114999
Java自学网站:https://how2j.cn?p=114999