抽象类
·在java中abstract是抽象的意思,可以修饰类、成员方法。
·abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。
注意事项
·抽象方法只有方法签名,不能声明方法体。
·一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则报错。
抽象的使用场景
·抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。
·当父类知道子类一定要完成某些行为,但是每个子类该行为实现有不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时可以声明成抽象类。
注意:一个类如果继承了抽象类,那么这个类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
public abstract class Animal{
public abstract void run();
}
就比如每个动物的run就不同,继承后各自去完成具体的细节(方法细节都不同)
案例:
? ? ? ? 系统需求:
? ? ? ? ? ? ? ? ·某加油站推出了2种支付卡,一种预存10000的金卡,后续加油享受折优惠,另一种是预存5000的银卡,后续加油享受8.5折优惠。
? ? ? ? ? ? ? ? ·请分别实现2种卡片进入收银系统后的逻辑,卡片需要包含主人名称、余额、支付功能。
? ? ? ? 分析实现:
? ? ? ? ? ? ? ? ·创建一张卡片父类:定义属性包括主人名称、余额、支付功能(具体实现交给子类)
? ? ? ? ? ? ? ? ·创建一张金卡类:重写支付功能,按照原价的8折计算输出。
? ? ? ? ? ? ? ? ·创建一张银卡类:重写支付功能,按照原价的8.5折计算输出。
代码:
Card类
public abstract class Card {
private String name;
private double money;
abstract void func(String name,double cash);
public Card() {
}
public Card(String name, double money) {
this.name = name;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
GoldCard类:
public class GoldCard extends Card {
@Override
void func(String name,double cash) {
System.out.println(getName()+"先生,请当前消费:"+cash+"元");
System.out.println(getName()+"先生,请卡片当前余额:"+getMoney()+"元");
double rs = cash*0.8;//优惠价
setMoney(getMoney()-rs);
System.out.println("您是金卡用户,您8折优惠后消费"+rs+"元,您的余额为"+getMoney());
}
public GoldCard() {
}
public GoldCard(String name, double money) {
super(name, money);
}
}
SilverCard类同GoldCard类同理;
Test类:
public class Test {
public static void main(String[] args) {
System.out.println("请输入开卡人姓名:");
Scanner sc = new Scanner(System.in);
String name = sc.next();
System.out.println("请输入预存金额:(金卡10000元,后续享受8折,银卡5000元,后续享受85折)");
double money = sc.nextDouble();
System.out.println("请输入加油多少钱");
double cash = sc.nextDouble();
if(money==10000){
GoldCard gc = new GoldCard(name,money);
gc.func(name,cash);
}
if(money==5000) {
SilverCard scc = new SilverCard(name, money);
scc.func(name, cash);
}
}
}
运行结果:
请输入开卡人姓名:
tom
请输入预存金额:(金卡10000元,后续享受8折,银卡5000元,后续享受85折)
10000
请输入加油多少钱
400
tom先生,请当前消费:400.0元
tom先生,请卡片当前余额:10000.0元
您是金卡用户,您8折优惠后消费320.0元,您的余额为9680.0
抽象类的特征和注意事项
·类有的成员(成员变量、方法、构造器)抽象类都具备。
·抽象类不一定有抽象方法,有抽象方法类一定是抽象类。
·一个类继承了抽象类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
·不能用abstract修饰变量、代码块、构造器。
最重要的特征:得到了抽象方法,失去了创建对象的能力(有得有失)
? ? ? ? ? ? ? ? 为什么?
? ? ? ? ? ? ? ? ? ? ? ? 假如抽象类可以创建对象,对象调用未实现的方法(没有方法体),程序直接报错。
final和abstract是什么关键字?
·互斥关系:final修饰的类不能被继承,而abstract修饰的类需要被继承