文章部分内容整理自知乎Peter McLeish的回答
- 第一章:枚举类
- 一:自定义一个枚举类
- 二:JDK提供的枚举类型
- 三:枚举中静态代码块的执行顺序
第一章:枚举类
枚举类:类的对象只有有限个,且是确定的
Java枚举型是静态常量,隐式地用static final修饰过,这里面包含了两层意思:
1:举型中的实例隐式地用public static final修饰过
2:枚举型作为某个类中的成员字段也隐式地用 static final修饰过
私有化类的构造器,保证不能在类的外部创建其对象在类的内部创建枚举类的实例
一:自定义一个枚举类
如何定义枚举类?方式一:JDK5.0之前,自定义枚举类步骤:私有化类的构造器,保证不能在类的外部创建其对象在类的内部创建枚举类的实例。声明为:public static final对象如果有实例变量,应该声明为private final,并且在构造器中初始化实例:
public class SeasonTest {public static void main(String[] args) {Season spring = Season.SPRING;System.out.println(spring)}}//自定义枚举类
class Season {//1.声明Season对象的属性:private final修饰private final String seasonName;private final String seasonDesc;//2.私有化类的构造器,并给对象属性赋值private Season(String seasonName, String seasonDesc) {this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//3.提供当前枚举类的多个对象:public static final的public static final Season SPRING = new Season("春天", "Spring");public static final Season SUMMER = new Season("夏天", "Summer");public static final Season AUTUMN = new Season("秋天", "Autumn");public static final Season WINTER = new Season("冬天", "Winter");//4.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求2:提供toString()@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
}
二:JDK提供的枚举类型
JDK5.0及其以后,可以使用enum关键字定义枚举类步骤:使用enum关键字定义枚举类声明对象属性,使用private final修饰私有化类的构造器,并给对象属性赋值提供当前枚举类的对象,多个对象之间用","隔开,末尾对象;结束
public class SeasonTest1 {public static void main(String[] args) {Season1 summer = Season1.SUMMER;System.out.println(summer);System.out.println("**********************");Season1[] values = Season1.values();for (int i = 0; i < values.length; i++) {System.out.println(values[i]);values[i].show();}Season1 winter = Season1.valueOf("WINTER");System.out.println(winter);winter.show();}
}interface Info {void show();
}//使用enum关键字
enum Season1 implements Info {//3.提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象;结束SPRING("春天", "Spring") {@Overridepublic void show() {System.out.println("where arr you");}},SUMMER("夏天", "Summer") {@Overridepublic void show() {System.out.println("i miss you");}},AUTUMN("秋天", "Autumn") {@Overridepublic void show() {System.out.println("i want to be with you");}},WINTER("冬天", "Winter") {@Overridepublic void show() {System.out.println("i want you");}};//1.声明Season对象的属性:private final修饰private final String seasonName;private final String seasonDesc;//2.私有化类的构造器,并给对象属性赋值private Season1(String seasonName, String seasonDesc) {this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//4.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求2:提供toString()@Overridepublic String toString() {return "Season1{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}/* @Overridepublic void show() {System.out.println("this is a season");}*/
}
enum类中的常用方法:values():返回枚举类型的对象数组。该方法可以方便地遍历所有的枚举值valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。toString():返回当前枚举类对象常量的名称enum使用说明:使用enum定义的枚举类默认继承了java.lang.Enum类,因此不能再继承其他类枚举类的构造器只能使用private权限修饰符必须在枚举类的第一行声明枚举类对象
三:枚举中静态代码块的执行顺序
package com.dashu.nettytest;import java.util.HashMap;
import java.util.Map;public enum FruitEnum {APPLE("苹果","红色","酸甜可口"),BANANA("香蕉","黄色","软糯香甜"),Orange("橘子","黄色","酸酸甜甜");private static final Map<String,FruitEnum> map = new HashMap<>();static {System.out.println("static。。。。。。。。。。。111");map.put("苹果",APPLE);map.put("香蕉",BANANA);map.put("橘子",Orange);System.out.println("static。。。。。。。。。。。222");}private String name;private String color;private String taste;{System.out.println("成员代码块");}private FruitEnum(String name,String color,String taste){this.name = name;this.color = color;this.taste = taste;System.out.println("构造方法");}}class shit {public static void main(String[] args) {FruitEnum apple = FruitEnum.APPLE;//成员代码块//构造方法//成员代码块//构造方法//成员代码块//构造方法//static。。。。。。。。。。。111//static。。。。。。。。。。。222}
}
枚举中都是static修饰的,类加载的时候就会将静态内容加载到JVM当中,静态内容也会按照顺序进行执行,但是执行到枚举中静态实例的会后就会触发构造法和成员代码块去创建对象。这样的话就会产生一种错觉,static修饰的代码块执行靠后了。