枚举和抽象类

枚举

  • 枚举的概述

    • 枚举是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后可以防止子类重写模板方法,这样更安全,更专业。

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

    • 提高了代码的复用性

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

<think>好的,我现在需要回答用户关于枚举类如何重写抽象方法的示例图解的问题。首先,我需要回顾Java枚举类的基本概念特性。枚举类在Java中可以像普通类一样拥有构造方法、成员变量方法,甚至可以实现接口或者包含抽象方法,每个枚举常量都需要实现这些抽象方法。 接下来,用户需要的是具体的示例图解。我应该先构造一个简单的枚举类示例,其中包含抽象方法,然后每个枚举常量都重写这个方法。例如,定义一个表示不同运算符的枚举类,每个运算符实现一个计算抽象方法。这样能够直观地展示抽象方法在枚举中的使用。 然后,关于图解部分,可能需要用文字描述枚举类的结构,比如类名、抽象方法、各个枚举常量及其具体实现。此外,用户提供的引用[1]中提到了递归方法的执行过程,或许可以借鉴栈的调用图示,说明枚举常量的初始化过程。不过枚举的实例化是在类加载时完成的,所以可能需要不同的图解方式,比如类结构图或方法调用流程。 需要确保示例代码正确,符合Java语法,并且每个枚举常量都正确重写了抽象方法。同时,检查是否有语法错误,比如枚举常量的定义顺序、分号的使用等。例如,枚举类中的抽象方法需要每个常量都实现,代码结构是否正确。 用户提供的引用中有关于递归的图解,可能可以类比,但枚举的初始化过程不同。可能需要描述枚举类在JVM中的加载过程,每个枚举常量作为实例被创建,并实现相应的抽象方法。例如,当枚举类被加载时,所有的枚举常量都会被初始化,并分别实现抽象方法,类似于不同的子类覆盖父类的方法。 另外,引用[3]提到了异常类型,虽然与当前问题无关,但需要注意示例代码中是否有潜在的异常需要处理,比如算术异常,但在这个示例中可能不需要,因为重点是展示抽象方法的重写。 总结步骤: 1. 创建一个枚举类,其中声明一个抽象方法。 2. 定义多个枚举常量,每个常量后面用大括号实现抽象方法。 3. 提供使用这些枚举常量的示例,展示不同实现的效果。 4. 用文字描述枚举类的结构初始化过程,类似于引用[1]中的栈调用图解,但调整为枚举的实例化过程。 需要确保代码示例正确,比如枚举常量之间用逗号分隔,最后一个常量用分号结束,抽象方法的正确重写等。此外,注意使用中文进行解释,结构清晰,分点说明。</think>### 枚举类重写抽象方法示例 #### 1. 枚举类定义抽象方法 在Java中,枚举类可以定义抽象方法,所有枚举常量必须实现该方法。以下示例演示如何通过枚举类实现运算符计算功能: ```java public enum Operator { // 枚举常量必须实现抽象方法 ADD { @Override public int calculate(int a, int b) { return a + b; } }, SUBTRACT { @Override public int calculate(int a, int b) { return a - b; } }, MULTIPLY { @Override public int calculate(int a, int b) { return a * b; } }; // 定义抽象方法 public abstract int calculate(int a, int b); } ``` #### 2. 使用枚举类方法 ```java public static void main(String[] args) { System.out.println(Operator.ADD.calculate(3, 5)); // 输出: 8 System.out.println(Operator.SUBTRACT.calculate(10, 4)); // 输出: 6 System.out.println(Operator.MULTIPLY.calculate(2, 6)); // 输出: 12 } ``` #### 3. 结构图解 1. **枚举类结构** - 父级枚举类 `Operator` 定义抽象方法 `calculate` - 每个枚举常量(`ADD`, `SUBTRACT`, `MULTIPLY`)作为子类实现抽象方法 ``` Operator(抽象类) ├── ADD(具体实现) ├── SUBTRACT(具体实现) └── MULTIPLY(具体实现) ``` 2. **内存加载过程** - JVM加载枚举类时,会初始化所有枚举常量[^1] - 每个常量生成独立实例,绑定对应的 `calculate` 方法实现 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值