抽象类:
格式: 修饰符 abstract class 类名
抽象方法:抽象类中定义的子类必须完成功能的功能的基本需求
格式: 修饰符 abstract 返回值类型 方法名称(形参列表)
抽象类是用来被继承的,抽象方法是交给子类重写实现的。
一个类如果继承了抽象类,那么这个类必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。(用我通俗的理解就是。一般父类是抽象类的话,他所定义的那些抽象方法,你这个子子类也要用到这些方法)。
抽象的特点:有得有失( 不能创建对象)
(留一个枚举的格式吧,以防用到:
修饰符 enum 枚举名称{
第一行都是罗列枚举类实例的名称(建议全部字母大写)
}
都是最终类,不可以被继承,相当于多例模式)
举个抽象类的案例:
做一个系统:一个加油站推出两种卡,一种是预存 10000元的金卡,后续加油享受8折优惠,另一种是预存5000元的银卡,后续加油享受8.5折优惠。请分别是两种卡片进入收银系统后的逻辑,卡片需要包含主人的名称、余额、支付功能。
个人分析:从中可以看出金卡,银卡都包含名称、余额。然而支付功能因为金卡,银卡是不同的优惠,因此可以定义一个父类,包含这两个所共有的(金额,名称),支付功能可以在子类的每个方法中分别定义。
父类card
package com.itheima.demo1;
public abstract class card {
private String name;//主人名称
private double money;
/**
* 子类是一定要支付的,但是每个子类支付的情况不一样,所以父类把子类定义为抽象类
*
* @return
*/
public abstract void pay(double 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
package com.itheima.demo1;
//金卡
public class GoldCard extends card {
@Override
public void pay(double money){
//优惠后的金额算出来
double rs = money * 0.8;
double lastMoney = getMoney() - rs;
System.out.println(getName() + "当前账户金额" + getMoney() + ",当前消费了" + rs + ",消费后的金额剩余" + lastMoney);
setMoney(lastMoney);//更新账户对象余额
}
}
银卡(其实就是把金卡的打折改一改,加一下限制就行了,我就不整了,下面给大家一个面试重要考点补过来)
面试考点:final 与 abstract 是什么关系? 互斥
(解释一下:final 是最终方法,不能被重写,不能被继承,然而abstract 很希望自己可以被继承,因为他那个抽象类方法只有子类征用了,定义这个抽象类才有意义,个人理解,用大白话给大家都说,错误可以指正)