2022/08/01 吉软 Java基础(15)泛型与枚举

泛型与枚举

枚举

枚举就是一个常量集合,规定某个类中的对象(枚举值) 个数(这个对象是被public static final修饰的),例如:季节(春/夏/秋/东)、星期(星期一到星期日)等

声明枚举

[修饰符列表] enum 枚举名 {类体}

阿里规约
【参考】枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开

 此处以声明SeasonEnum为例

package com.jsoft.enumdemo;

public enum SeasonEnum {

    // 枚举对象 -----> 必须在类体最上面
    SPRING(1,"春天"),
    SUMMER(2,"夏天"),
    AUTUMN(3,"秋天"),
    WINTER(); // -----> 此处的“()”可以省略
    // 构造器
    SeasonEnum() {}
    SeasonEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }

    // 属性
    private int code;
    private String name;

    // Getter Setter
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}
  • 枚举类中枚举对象放必须在类体的最前面
  • 枚举类中枚举对象(枚举值)都是被public static final修饰的,是常量,规范要求命名大写
  • 枚举类中的枚举对象之间以",“分割,并且最后一个枚举对象以”;"结尾
  • 枚举类中构造器都是私有的,并且可以省略“private”
  • 枚举类中可以有Getter/Setter方法
  • 枚举类中枚举对象如果是无参的可以省略“()”

枚举的静态导入

import static 全类名.枚举对象名/通配符(*)

为什么要静态导入枚举? ——> 对枚举使用静态导入可以省略"枚举类.",直接使用枚举对象

package com.jsoft.enumdemo;
// 枚举的静态导入
import static com.jsoft.enumdemo.SeasonEnum.*;

public class Test {
    public static void main(String[] args) {
        SeasonEnum season1 = SeasonEnum.AUTUMN;
        // 对枚举使用静态导入可以省略枚举类,直接使用枚举对象
        SeasonEnum season2 = AUTUMN;
    }
}

自动拆装箱

   装箱:把基本的数据类型转换成包装类

            八种基本数据类型对应的包装类:int -- Integer 、char --Character 其他的首字母大写

   拆箱:把基本的包装类转换成基本的数据类型

  JDK向下兼容

枚举的应用

枚举应用在switch分支中(java5新特性)

package com.jsoft.enumdemo;

import static com.jsoft.enumdemo.SeasonEnum.*;

public class Test {
    public static void main(String[] args) {
        SeasonEnum season = AUTUMN;

        switch (season) {
            case SPRING:
                System.out.println("春天");
                break;
            case SUMMER:
                System.out.println("夏天");
                break;
            case AUTUMN:
                System.out.println("秋天");
                break;
            case WINTER:
                System.out.println("冬天");
                break;
            default:
        }
    }
}

使用枚举类实现单例模式


class Singleton {

    // 私有化构造器
    private Singleton() {}

    // 提供公有的获取实例的静态方法
    public static Singleton getInstance(){
        return SingletonHolder.INSTANT.instant;
    }

    // 声明一个枚举类(内部类)
    private enum SingletonHolder{

        INSTANT;

        private final Singleton instant;

        SingletonHolder() {
            instant = new Singleton();
        }
    }
}

枚举值的比较

因为枚举类中都是常量(静态常量),所以对枚举进行等值比较时建议 使用“==”进行比较。

枚举的优势

对于有多种情况的选择时,我们可以使用int类型的常量也可以使用枚举,那么枚举相对int类型有什么优势呢?

  1. int类型不具备安全性。假如程序员在声明变量时手一哆嗦,少写了final,该变量会存在被他人修改的风险;而枚举类天然就是一个常量类,不存在失误的情况
  2. 使用int类型,语义不够明确。

泛型

什么是泛型(Generics)?

  • 泛型能够帮助我们把[类型明确]的工作推迟到创建对象或调用方法的时候,
  • 意思就是:我定义类的时候,不需要考虑这个数组到底要存什么类型。
  • 创建这个超级数组对象的时候把里面要存的数据类型确定下来
  • 在创建对象的时候没有指定泛型,默认T时Object类型

泛型的修饰:

  1. 泛型类
  2. 泛型方法
  3. 泛型接口:

        泛型类把泛型定义在类上,用户在使用类的时候才能把类型给确定

        具体语法: “<未知数>”,通常用T K V等大写字母表示

 泛型类

public class Test<T> {
	public static void main(String[] argfs){

	}
}

继承关系中的泛型

泛型类在继承时:

  1. 父类是一个泛型类,子类要不要是泛型类? 随便
  2. 泛型在声明时只能在当前类名后或方法返回值类型之前声明
  3. 在子类继承父类时,子类泛型和父类泛型都写出来的情况下,父跟子
  4. 如果在继承时,没有写出任何泛型,当前子类就不是泛型类
  5. 在继承关系中,如果需要,父类和子类都需要指定泛型

泛型方法

  • 如果我们只关系某个方法,可以不定义泛型类,只定义泛型方法
  • 泛型方法是不是一定要在泛型类里: 不是
  • 泛型类中是不是一定要有泛型方法:不是
  • 在定义泛型方法时,要首先定义泛型的类型
  • 使用泛型方法,最好要结合返回值,否则和Object一样
  • 定义在方法中间,修饰符列表之后,返回值类型之前
public class Test {
	//声明泛型方法	
	public <T> T method(T t) {
		return t;
	}
	public static void main(String[] args){
		// 调用泛型方法,在传参的时候确定数据类型
		String str = new Test().method("123");
	}
}

泛型方法和泛型类

  • 如果一个泛型类中,尽量不要在使用泛型方法
  • 泛型方法多数都是出现在非泛型类中

静态泛型方法

  1. 静态方法如果时泛型方法,泛型的声明必须写
  2. 因为静态结构是属于类的,不属于某个对象那个

注意;在Java7开始,可以省略等号右边的泛型的声明,<>必须得写(规范)

 通配符

	泛型中的通配符用"?"表示,

类型擦除

为了兼容性,使用原始类型(没有泛型)是可以的。
泛型刚刚出现的时候,还存在大量的不适用泛型的代码,
保证代码的兼容性,将参数化类型的实例传递给设计用于原始类型的方法必须
为例保持兼容性,Java泛型中,其实有一种类似伪泛型,因为Java在编译期间所有的泛型都会被擦掉
Java的泛型语法是在编译期这个维度上实现
正常来书在生成第字节码文件中,不包含泛型的类型信息的
在JVM中,由泛型附加的类型信息对JVM是看不到的
可以理解为,泛型的本质是让程序员在编写代码时遵守的一个规则
比如SuperArray: 在确定了泛型之后,这个超级数组就统一只放同一类型的数据,如果放入其他类型,编译不通过

泛型的应用场景

父类(接口),起到的是一个规范的作用,对里面的数据类型是没有明确要求的
容器类(超级数组,链表、队列、栈
当类型无法确定时,使用泛型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值