面向对象高级(枚举泛型)
3.1 认识枚举3.1.1 认识枚举、枚举的原理枚举是一种特殊的类它的格式是public enum 枚举类名{ 枚举项1,枚举项2,枚举项3; }3.1.2 枚举深入既然枚举是一个类的话我们能不能在枚举类中定义构造器、成员变量、成员方法呢答案是可以的。来看一下代码吧public enum A{ //定义枚举项 X,Y,Z(张三); //枚举项后面加括号就是在执行枚举类的带参数构造方法。 //定义空构造器 A(){ } //成员变量 private String name; //定义带参数构造器 A(String name){ this.namename; } //成员方法 public String getName(){ return name; } ... }public class Test{ public static void main(String[] args){ //获取枚举A类的枚举项 A a1 A.X; A a2 A.Y; A a3 A.Z; // 获取X当前的位置 System.out.println(a2.ordinal()); // 获取Z后的字符串名称 System.out.println(a3.getName()); } }虽然枚举类中可以像类一样写一些类的其他成员但是一般不会这么写如果你真要这么干的话到不如直接写普通类来的直接。枚举类的特点: 枚举类的第一行只能罗列一些名称这些名称都是常量并且每个常量记住的都是枚举类的一个对象。 枚举类的构造器都是私有的写不写都只能是私有的因此枚举类对外不能创建对象。 枚举都是最终类不可以被继承。 枚举类中从第二行开始可以定义类的其他各种成员。 编译器为枚举类新增了几个方法并且枚举类都是继承java.lang.Enum类的从enum类也会继承到一些方法。3.2 枚举的应用场景枚举一般表示一组信息然后作为参数进行传输。这里我们就可以先定义一个枚举类用来表示男生、或者女生public class Constant{ BOY,GRIL }再定义一个测试类完成用户进入系统后的选择public class Test{ public static void main(String[] args){ //调用方法传递男生 provideInfo(Constant.BOY); } // 参数是根据用户选择的性别来进行判断 public static void provideInfo(Constant c){ switch(c){ case BOY: System.out.println(展示一些信息给男生看); break; case GRIL: System.out.println(展示一些信息给女生看); break; } } }最终再总结一下枚举的应用场景枚举一般表示几个固定的值然后作为参数进行传输。总结:1. 选择定义一个一个的常量来表示一组信息并作为参数传输参数值不受约束。2. 选择定义枚举表示一组信息并作为参数传输代码可读性好参数值得到了约束对使用者更友好建议使用!泛型4.1 认识泛型所谓泛型指的是在定义类、接口、方法时同时声明了一个或者多个类型变量如E称为泛型类、泛型接口、泛型方法、它们统称为泛型。泛型的好处泛型提供了在编译阶段约束所能操作的数据类型并自动进行检查的能力这样可以避免强制类型转换及其可能出现的异常。泛型的本质把具体的数据类型传递给类型变量。4.2 自定义泛型类自定义泛型类的格式如下//这里的T,W其实指的就是类型变量可以是一个也可以是多个。 修饰符 class 类名类型变量, 类型变量{ } 注意类型变量建议用大写的英文字母常用的有E、T、K、V 等4.3 自定义泛型接口泛型接口其实指的是在接口中把不确定的数据类型用类型变量表示。定义格式如下//这里的类型变量一般是一个字母比如E 修饰符 interface 接口名类型变量, 类型变量, ...{ }4.4 泛型方法泛型方法的格式修饰符 泛型变量,泛型变量,... 返回值类型 方法名(形参列表){ }下图中在返回值类型和修饰符之间有T定义的才是泛型方法, 后边方法的E是用类的类型变量所以不是泛型方法。4.5 泛型限定泛型限定的意思是对泛型的数据类型进行范围的限制。有如下的三种格式? 表示任意类型? extends 数据类型 表示指定类型或者指定类型的子类? super 数据类型 表示指定类型或者指定类型的父类4.6 泛型擦除也就是说泛型是工作在编译阶段的一旦程序编译成class文件class文件中就不存在泛型了这就是泛型擦除。而且泛型只支持引用数据类型不支持基本数据类型。把下面的代码的字节码进行反编译看效果:public class Test { public static void main(String[] args) { //泛型是工作在编译阶段的一旦程序编译成class文件class文件中就不存在泛型了这就是泛型擦除。 ArrayListString list new ArrayList(); list.add(柳岩); list.add(宝强); String name list.get(0); System.out.println(name); //泛型不支持基本数据类型只能支持对象类型引用数据类型。 // ArrayListint list new ArrayList(); } }