枚举和抽象类

枚举

  • 枚举的概述

    • 枚举是Java中的一种特殊类型

  • 枚举的作用:”是为了做信息的标志和信息的分类“

  • 定义枚举类的格式:

    • 修饰符 enum 枚举名称{
          //第一行都是罗列枚举实例的名称。
      }
    • enum Season{ SPRING,SUMMER,AUTUMN,WINTER;
      }
      Complied from "Seacon.java"  //上述枚举反编译后的结果。
      public final class Season extends java.lang.Eum<season>{
          public static final Season SPRING = new Season();
          public static final Season SUMMER = new Season();
          public static final Season AUTUMN = new Season();
          public static final Season WINTER = new Season();
          public static Season[] values();
          public static Season valueOf(java.lang.String);
          
      }

  • 枚举的特征

    • 枚举类都是继承了枚举类型:java.lang.Enum

    • 枚举类都是最终类,不可以被继承

    • 枚举类的构造器都是私有的,枚举对外不能创建对象

    • 枚举类的第一行默认都是罗列枚举对象的名称的。

    • 枚举类相当于是多例模式。

  • switch已经兼容枚举

抽象类

  • 在Java中abstract是抽象的意思,可以修饰类、成员方法。

  • abstact修饰类,这个类就是抽象类,修饰方法,这个方法就是抽象方法。

  • 修饰符 abstract class类名{
        修饰符 abstract 返回值类型 方法名称(形参列表);
    }
    public abstract class Animal{
        public abstract void run();
    }

  • 注意事项

    • 抽象方法只有方法签名,不能申明方法体

    • 一个类中如果定义了抽象方法,这个类必须声明称抽象类,否则报错。

  • 抽象的使用场景

    • 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。

    • 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义称抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。

    • public abstract class Animal{
          public abstract void run();
      }

抽象类的应用案例

  • 系统需求

    • 某加油站推出了2中支付卡,一种是预存10000的金卡,后续加油享受8折优惠,另一种是预存5000的银卡,后续加油享受8.5折优惠。

    • 请分别实现2中卡片进入收银系统后的逻辑,卡片需要包含主人的名称、余额、支付功能。

  • 分析实现

    • 创建一张卡片父类:定义属性包括主人名称、余额、支付功能(具体实现交给子类)

    • 创建一张白金卡类:重写支付功能,按照原价8折计算输出。

    • 创建一张银卡类:重写支付功能,按照原价8.5折计算输出。

  • 特征和注意事项

    • 类有的成员(成员变量、方法、构造器)抽象类都具备

    • 抽象类中不一定有抽象方法,有抽象方法得类一定是抽象类。

    • 一个类继承了抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

    • 不能用abstract来修饰变量、代码块、构造器。

    • 抽象类可以得出抽象方法,但是失去了创造对象的能力。

  • final和abstract是什么关系?

    • 互斥关系

    • final修饰类,其为最终类,不能被继承,而abstract修饰抽象类,其必须被继承。

    • 抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。

抽象类的应用知识:模板方法模式

  • 什么时候使用模板方法模式?

    • 使用场景说明:当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。

  • 模板方法实现步骤:

    • 把功能定义成一个所谓的模板方法,放在抽象类中,模板方法之定义通用且能确定的代码

    • 模板方法中不能决定的功能定义成抽象方法,去让具体子类实现。

  • 模板方法我们是建议使用final来修饰的,这样会更加专业,为什么?

    • 模板方法是给子类直接使用的,不是让子类重写的,一旦子类重写了模板方法,则模板方法就会失效,因此,加上final后可以防止子类重写模板方法,这样更安全,更专业。

  • 模板方法模式解决了什么问题?

    • 提高了代码的复用性

    • 模板方法已经定义了通用结构,模板方法不能确定的部分定义成抽象方法,交给子类实现,因此,使用者是需要关心自己需要实现的功能即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值