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 中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。

它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口

泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型。

集合体系的全部接口和实现类都是支持泛型的使用的。

泛型可以在很多地方进行定义:在类后面是泛型类;在方法申明上,是泛型方法;在接口后面,是泛型接口。

  1. 泛型的好处

统一数据类型;把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。

泛型的定义和使用

泛型类

  1. 定义格式

修饰符 class 类名<类型/泛型变量> { }

范例:public class MyArrayList<T> { }

- 此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。
- 作用:编译阶段可以指定数据类型,类似于集合的作用。
  1. 泛型类的原理(核心思想)

把出现泛型变量的地方全部替换成传输的真实数据类型。

泛型方法

  1. 定义格式

修饰符 <类型> 返回值类型 方法名(类型 变量名) { }

修饰符 <泛型变量> 方法返回值 方法名称(形参列表){ }

范例: public void show(T t) { }

- 作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。
  1. 泛型方法的原理

把出现泛型变量的地方全部替换成传输的真实数据类型。

泛型接口

  1. 定义格式

修饰符 interface 接口名<类型/泛型变量> { }

范例: public interface Data{}

- 作用:泛型接口可以约束实现类,可以让实现类选择当前功能需要操作的数据类型
  1. 泛型接口的原理

实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作。

泛型通配符

型的通配符后,只能使用 Object 类中的共性方法,集合中元素自身方法无法使用。

  1. 泛型通配符的作用

为了表示各种泛型 List 的父类,可以使用类型通配符。

  1. 泛型通配符的分类
  • 泛型通配符: <?>

不知道使用什么类型来接收的时候,可以使用?,?表示未知通配符。? 可以在"使用泛型"的时候代表一切类型。

如: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 的父类。