1. 认识枚举
2. 泛型
1. 枚举
枚举是一种特殊类
枚举类的格式:
修饰符 enum 枚举类名 {
名称1,名称2,...;
其他成员...
}
Public enum A {
x,y,z;
...
}
注意:
枚举类的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开,这些名称,本质是常量,每个常量都会记住一个枚举类的一个对象
枚举类的特点
A[] as = A.values(); // 拿到全部对象
A a3 = A.valueof("z"); // 拿到单个对象
Public enum A {
x,y,x;
} // 反编译class文件如下
---------------------------------------------------------------------------------------------
Compiled from "A.java"
Public final class A extends java.lang.Enum<A> {
public static final A x = new A();
public static final A y = new A();
public static final A z = new A();
public static A[] values(); // 拿到当前全部对象
public static A valueof(java.lang.String); // 拿到单个对象
}
- 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象
- 枚举类的构造器都是私有的(写不写都只能是私有的),因此枚举类对外不能创建对象
- 枚举类都是最终类,不可以被继承
- 枚举类中,从第二行开始,可以定义类的其他各种成员
- 编译器为枚举类新增了几个方法,并且枚举类都是继承:java.Lang.Enum类,从enum类也会继承到一些方法
枚举类常见的应用场景(做信息标志和分类)
用来表示一组信息,然后作为参数值进行传输
选择定义一个一个的变量来表示一组信息,并作为参数传输,参数值不受约束
选择定义枚举表示一组信息,并作为参数传输,代码可读性好,参数值得到了约束,对使用者更友好,建议使用!
// 用常量做信息标志
public class Test1 {
public static void main(String[] args) {
check(Constant.BOY); // 用户可以传入任何值,不受约束
}
public static void check(int sex) {
switch(sex) {
case Constant.BOY:
System.out.println("展示一些男生喜欢的事物");
break;
case Constant.GIRL:
System.out.println("展示一些女生喜欢的事物");
break;
}
}
}
---------------------------------------------------------------------------------------------
public class Constant {
public static final int BOY = 0;
public static final int GIRL = 1;
}
// 用枚举做信息标志和分类可读性比较好,比较严谨
public class Test1 {
public static void main(String[] args) {
check(Constant2.BOY);
}
public static void check(Constant2 sex) {
switch (sex) {
case BOY:
System.out.println("展示一些男生喜欢的事物");
break;
case GIRL:
System.out.println("展示一些女生喜欢的事物");
break;
}
}
}
---------------------------------------------------------------------------------------------
public enum Constant2 {
BOY,GIRL;
}
2. 泛型
定义类、接口、方法时,同时声明了一个或者多个类型变量(如:),称为泛型类,泛型接口,泛型方法,它们通称为泛型
Public class ArrayList(E) {
}
作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常
泛型的本质:把具体的数据类型作为参数传给类型变量
1. 泛型类
修饰符 class 类名<类型变量,类型变量,...> {
}
Public class ArrayList<E> {
}
2. 泛型接口
修饰符 interface 接口名<类型变量,类型变量,...> {
}
Public interface A<E> {
}
注意:
类型变量建议用大写的英文字母,常用的有:E、T、K、V等
通配符:就是"?",可以在使用泛型的时候代表一切类型,E、T、K、V,是在定义泛型的时候使用
泛型的上下限:
- 泛型上限:? extends Animal : ? 能接收的必须是Animal或者其子类
- 泛型下限:?super Animal :?能接收的必须是Animal或者其父类
3. 泛型方法
修饰符 <类型变量,类型变量,...> 返回值类型 方法名(形参列表) {
}
Public static <T> void test(T t) {
}
// 在泛型类里出现的方法,不是泛型方法,类型变量E不是这个方法自己定义的,
而是泛型类声明的给到这些方法使用的,像这些方法没有自己定义类型变量,
而是用别人的类型变量,它就不是泛型方法
Public E get(int index) { (x)
}
泛型的擦除问题和注意事项
- 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除
- 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)