跟徐磊第三天

发布时间:2024年01月20日

抽象类

·在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修饰的类需要被继承

文章来源:https://blog.csdn.net/jin425105/article/details/135685324
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。