如何实现一个类只能有固定个数的对象?
public class EnumDemo {
public static void main(String[] args) {
Season chun = Season.SPRING;
System.out.println(chun);//Season@135fbaa4
}
}
class Season {
//一个类只有固定个数对象的实现,比如季节只有四个对象,不允许修改
//final保证不能被修改,public 让外界可以访问,静态让外界不用创建对象就可以访问
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();
//构造函数私有,则可实现外界无法创建对象。需要在定义类时创建对象。
private Season() {
}
}
枚举入门
//jdk1.5 之前,创建固定个数对象比较麻烦~见上
//jdk1.5之后,使用enum定义枚举类
/枚举中的值不可以被改变
枚举类编译后就是普通的class。枚举本质是特殊的类。比如编译后生成Season.class
枚举不能被继承
Java 中的每一个枚举都继承自 java.lang.Enum
类,所以枚举不能再继承其他类
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
}
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
枚举可以有属性和方法
一般class有的,枚举类型都可以有,比如枚举对象可以有属性和方法.
如下,Season
是个枚举类,Season.SPRING
就是个对象,和你new
出来的对象没什么不同. 既然是对象,就可以有属性和方法.
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Season.SPRING);//SPRING
System.out.println(Season.SUMMER.name());//SUMMER
System.out.println(Season.SUMMER.getName());//夏天
Season.AUTUMN.show();//this is 秋天
}
}
enum Season {
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
private String name;
//枚举的构造方法默认就是private的,所以可以不用写private
Season() {
}
Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//枚举中也可以定义方法
public void show() {
System.out.println("this is " + name);
}
//也可以定义静态方法
public static void fun() {
System.out.println("fun");
}
}
枚举可以有抽象方法
写了抽象方法,其枚举实例就必须实现该方法.
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Season.SPRING);//SPRING
System.out.println(Season.SUMMER.name());//SUMMER
Season.AUTUMN.show();//秋
}
}
//如果除了枚举项还有其他代码,最后一个枚举项后面需要加分号
//如果枚举类中有抽象方法,必须在每个枚举项重写该方法。
enum Season {
SPRING("春天") {
@Override
public void show() {
System.out.println("春");
}
}, SUMMER("夏天") {
@Override
public void show() {
System.out.println("夏");
}
}, AUTUMN("秋天") {
@Override
public void show() {
System.out.println("秋");
}
}, WINTER("冬天") {
@Override
public void show() {
System.out.println("冬");
}
};
private String name;
//枚举的构造方法默认就是private的,所以可以不用写private
Season() {
}
Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//枚举可以有抽象方法,但是有抽象方法时,必须在每个枚举项中重写该方法
public abstract void show();
}
枚举可以实现接口
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Season.SPRING);//SPRING
System.out.println(Season.SUMMER.name());//SUMMER
Season.AUTUMN.ff();//this is a test
}
}
interface inter {
public void ff();
}
//如果除了枚举项还有其他代码,最后一个枚举项后面需要加分号
//如果枚举类中有抽象方法,必须在每个枚举项重写该方法。
enum Season implements inter {
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
private String name;
//枚举的构造方法默认就是private的,所以可以不用写private
Season() {
}
Season(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void ff() {
System.out.println("this is a test");
}
}
总结
- 枚举本质就是class
- 枚举还是很灵活的