内容目录
java
枚举类
枚举的概述
枚举的作用:"是为了做信息的标志和信息的分类"。
单例类:
- 构造器私有化
- 本类内部创建一组对象
- 添加 public static 修饰符,对外暴露对象
定义枚举类的格式
自定义枚举类
- 构造器私有化
- 本类内部创建一组对象
- 添加 public static 修饰符,对外暴露对象
//构造器:无参 示例:性别类
class Sex {
//1.构造器私有化
private Sex() {}
//2.本类内部创建一组对象,并添加public static修饰符,对外暴露该对象
public static Sex boy = new Sex();
public static Sex girl = new Sex();
}
public class TestEnum1 {
public static void main(String[] args) {
Sex girl= Sex.girl;
System.out.println(girl);
}
}
通过enum定义枚举类
enum 枚举类类名 { 对象名 1,对象名 2; }
// 示例 enum Season{ SPRING , SUMMER , AUTUMN , WINTER; }
<h3 id="Wi1wx">枚举的特征和注意事项</h3>
枚举类的特征:
+ 枚举类都是继承了枚举类型:java.lang.Enum
+ 枚举都是最终类,不可以被继承。
+ 构造器都是私有的,枚举对外不能创建对象。
+ 枚举类的第一行默认都是罗列枚举对象的名称的。
+ 枚举类相当于是多例模式。
```java
enum Season{
SPRING , SUMMER , AUTUMN , WINTER;
}
Compiled from "Season.java"
public final class Season extends java.lang.Enum<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);
}
枚举类的注意事项:
- 如果枚举类没有任何的构造器时,JVM 自动给其提供一个私有无参的构造器;一旦有任何构造器,JVM 不
- 在提供枚举类中的构造器的访问权限只能是 private,不能是其他的访问权限,即使访问权限不写(缺省),JVM 自动补上 private
- 枚举类中对象名的这一行必须放在类中的第一行,对象名前面有其他的代码,编译报错
- 如果枚举类中的对象是通过无参构造器进行对象的创建,对象名后面的( )可以省略不写
- 枚举类的中的对象被 public static final 进行修饰
- 枚举类都默认隐式继承 Enum 类,无法继承其他类,但可以实现接口
- 程序中的其他类也不能继承枚举类
枚举类的结构
public class SeasonEnum {
// 注:枚举写在最前面,否则编译报错
SPRING,SUMMER,AUTUMN,WINTER;
private final static String position = "first";
public static SeasonEnum getSeason(String s) {
if (position.equals(s)) {
return SPRING;
} else {
return AUTUMN;
}
}
}
- 设计带构造器的枚举
public class Gender {
//通过括号赋值,必须带有一个构造器和一个属性和方法,否则编译报错。
//赋值必须都赋值或者都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也会报错
MAN("MAN"), WOMEN("WOMEN");
private final String vaule;
// 构造器默认也只能是private,从而保证构造函数只能在内部使用
Gender(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
- 设计带抽象方法的枚举
public enum OrderState {
CANCEL {public String getName(){return "已取消";}},
WAITCONFIRE {public String getName(){return "待审核";}},
WAITPAYMENT {public String getName(){return "等待付款";}},
ADMEASUREPRODUCT {public String getName(){return "正在配送";}},
WAITDELIVER {public String getName(){return "等待发货";}},
DELIVERED {public String getName(){return "已发货";}},
RECEIVED {public String getName(){return "已收货";}};
public abstract String getName(); // 此枚举类的抽象方法
}
枚举的应用
步骤序号 | 步骤详解 |
---|---|
values() | 取得所有的枚举成员实例,并以数组方式返回 |
compareTo() | 比较两个枚举对象在枚举时的顺序 |
ordinal() | 根据枚举顺序得到位置索引,默认以 0 开始 |
泛型
泛型的概述和优势
泛型:是 JDK5 中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型。
集合体系的全部接口和实现类都是支持泛型的使用的。
泛型可以在很多地方进行定义:在类后面是泛型类;在方法申明上,是泛型方法;在接口后面,是泛型接口。
- 泛型的好处
统一数据类型;把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
泛型的定义和使用
泛型类
- 定义格式
修饰符 class 类名<类型/泛型变量> { }
范例:public class MyArrayList<T> { }
- 此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。
- 作用:编译阶段可以指定数据类型,类似于集合的作用。
- 泛型类的原理(核心思想)
把出现泛型变量的地方全部替换成传输的真实数据类型。
泛型方法
- 定义格式
修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
修饰符 <泛型变量> 方法返回值 方法名称(形参列表){ }
范例: public void show(T t) { }
- 作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。
- 泛型方法的原理
把出现泛型变量的地方全部替换成传输的真实数据类型。
泛型接口
- 定义格式
修饰符 interface 接口名<类型/泛型变量> { }
范例: public interface Data{}
- 作用:泛型接口可以约束实现类,可以让实现类选择当前功能需要操作的数据类型
- 泛型接口的原理
实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作。
泛型通配符
型的通配符后,只能使用 Object 类中的共性方法,集合中元素自身方法无法使用。
- 泛型通配符的作用
为了表示各种泛型 List 的父类,可以使用类型通配符。
- 泛型通配符的分类
- 泛型通配符: <?>
不知道使用什么类型来接收的时候,可以使用?,?表示未知通配符。? 可以在"使用泛型"的时候代表一切类型。
如:List<?> :表示元素类型未知的 List,它的元素可以匹配任何的类型。
这种带通配符的 List 仅表示它是各种泛型 List 的父类,并不能把元素添加到其中,此时只能接受数据,不能往该集合中存储数据。
E T K V 是在定义泛型的时候使用的。
注意:泛型不存在继承关系 Collection list = new ArrayList(); 这种是错误的。比如:
虽然 BMW 和 BENZ 都继承了 Car 但是 ArrayList 和 ArrayList 与 ArrayList 没有关系的!!
- 泛型通配符上限: <? extends 类>
- 只能接收该类型及其子类。
- 类型名称 <? extends 类 > 对象名称
比如:List<? extends Number> :?表示的类型是必须 Number 或者其子类。
- 类型通配符下限: <? super 类型>
- 只能接收该类型及其父类型
- 格式:类型名称 <? super 类 > 对象名称
比如:List<? super Number> :?表示的类型必须是 Number 或者其父类。
像现已知 Object 类,String 类,Number 类,Integer 类,其中 Number 是 Integer 的父类。