枚举
-
枚举的概述
-
枚举是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后可以防止子类重写模板方法,这样更安全,更专业。
-
-
模板方法模式解决了什么问题?
-
提高了代码的复用性
-
模板方法已经定义了通用结构,模板方法不能确定的部分定义成抽象方法,交给子类实现,因此,使用者是需要关心自己需要实现的功能即可。
-