)
1.枚举 (Enum)1.1 枚举的定义枚举是使用enum声明的、由一组预定义的本类型常量组成的引用数据类型。枚举本质是一个继承自java.lang.Enum的final类,其枚举常量是public static final的实例。1.2 枚举的声明语法public enum SeasonEnum { SPRING, SUMMER, AUTUMN, WINTER }1.3 获取枚举实例的方法方法示例说明通过枚举常量获取SeasonEnum se = SeasonEnum.SPRING;最常用通过指定名称获取SeasonEnum se = SeasonEnum.valueOf("SPRING");名称必须存在,否则抛异常获取所有枚举实例数组SeasonEnum[] seArray = SeasonEnum.values();常用于遍历// 完整案例 public class EnumGetInstanceDemo { public static void main(String[] args) { // 方式1 SeasonEnum se1 = SeasonEnum.SPRING; // 方式2 SeasonEnum se2 = SeasonEnum.valueOf("SUMMER"); // 方式3 for (SeasonEnum se : SeasonEnum.values()) { System.out.println(se.name() + " - 序号: " + se.ordinal()); } } }1.4 枚举的本质源代码: enum Color { RED, GREEN, BLUE } ↓ 编译后 final class Color extends EnumColor { public static final Color RED = new Color(); public static final Color GREEN = new Color(); public static final Color BLUE = new Color(); private Color() {} // 构造器私有 }枚举类型编译后是一个final 类,自动继承Enum类枚举常量会自动编译成public static final每一个枚举常量对应一个枚举实例1.5 Enum 类特征:JDK 1.5 新增直接继承Object类是一个抽象类是所有枚举类型的公共父类(由枚举类型自动继承)常用方法:方法说明name()返回枚举常量的名称ordinal()返回枚举常量的序号(从0开始)valueOf(Class, String)返回指定名称的枚举常量1.6 枚举注意事项规则说明正确示例错误示例枚举常量必须声明在第一行若有其他内容,常量后必须加分号SPRING, SUMMER; private int x;常量写在第二行构造器必须是private枚举不能被外部实例化private SeasonEnum(){}public SeasonEnum(){}枚举不能通过new实例化枚举实例是预定义的常量SeasonEnum.SPRINGnew SeasonEnum()// 完整枚举案例(带成员变量和方法) public enum SeasonEnum { // 常量必须第一行,带参数调用构造器 SPRING("春天", "温暖"), SUMMER("夏天", "炎热"), AUTUMN("秋天", "凉爽"), WINTER("冬天", "寒冷"); private String name; private String feature; // 构造器必须是 private private SeasonEnum(String name, String feature) { this.name = name; this.feature = feature; } public String getName() { return name; } public String getFeature() { return feature; } public void show() { System.out.println(name + "是" + feature); } } // 使用 public class SeasonTest { public static void main(String[] args) { SeasonEnum.SPRING.show(); // 春天是温暖 } }代码案例public enum SeasonEnum { // 1. 枚举常量必须在第一行,多个用逗号隔开 SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天"); // 成员变量 private String desc; // 2. 构造器必须是 private private SeasonEnum(String desc) { this.desc = desc; } public String getDesc() { return desc; } } // 使用示例 public class EnumDemo { public static void main(String[] args) { // 方式1:直接引用 SeasonEnum se = SeasonEnum.SPRING; System.out.println(se.name() + ": " + se.getDesc()); // 方式2:valueOf SeasonEnum se2 = SeasonEnum.valueOf("SUMMER"); // 方式3:获取所有实例 for (SeasonEnum s : SeasonEnum.values()) { System.out.println(s.ordinal() + " - " + s.name()); } } }2.泛型 (Generics)2.1 泛型的定义泛型是通过参数化类型提高代码重用性,并在编译期强制进行类型检查的机制。泛型实现了“参数化类型”,将类型检查从运行时提前到编译时,解决了Object带来的类型转换安全隐患。泛型边界通配符图解:继承链: Object (爷爷) ↑ Number (父类) ↙ ↘ Integer Double (子类) ? extends Number → 允许 Number 及其子类 (Integer, Double) → 上界 (Upper Bound) ? super Integer → 允许 Integer 及其父类 (Number, Object) → 下界 (Lower Bound)2.2 泛型的由来(为什么需要泛型)在 JDK 1.5 之前,为提高代码复用,将Object作为通用类,容易使得编译期和运行时类型不一致,从而引发ClassCastException(类型转换异常)。从 JDK 1.5 开始,Java 引入泛型机制,用以解决此问题。// JDK1.5 之前的问题 List list = new ArrayList(); list.add("字符串"); list.add(123); // 可以混入不同类型 String s = (String) list.get(1); // 运行时崩溃!ClassCastException // JDK1.5 之后(泛型解决) ListString list = new ArrayList(); list.add("字符串"); // list.add(123); // 编译错误,类型安全 String s = list.get(0); // 无需强制转换2.3 语法格式泛型类class 类名称T { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } }泛型接口interface 接口名称T { T doSomething(T t); }泛型方法访问修饰符 类型形式参数列表 返回值类型 方法名(参数列表) { // 方法体 }使用泛型方法的场景:需要提高代码重用性时,可以使用泛型方法。静态方法中传入泛型参数时,必须使用泛型方法。// 泛型方法案例 public class GenericMethodDemo { // 静态泛型方法 public static T void printArray(T[] array) { for (T t : array) { System.out.print(t + " "); } System.out.println(); } public static void main(String[] args) { Integer[] ints = {1, 2, 3}; String[] strs = {"A", "B", "C"}; printArray(ints); // 1 2 3 printArray(strs); // A B C } }2.4 泛型的作用使用泛型可以解决类型转换异常的问题,增加了代码在编译时类型的安全性。2.5 泛型的特点特点说明可重用性好一份代码适用多种类型类型安全编译期检查类型错误执行效率高无需强制类型转换2.6 泛型标识符的定义常用标识符含义TType(类型)EElement(元素,常用于集合)KKey(键)VValue(值)NNumber(数值)?通配符(未知类型)2.7 泛型的常用规则规则说明正确示例错误示例类型实参只能是引用类型不能是基本数据类型ListList同一种泛型可有多个版本不同版本需考虑兼容性List和List是不同类型