60. 枚举
jdk1.5新特性之------枚举
问题:在我们编写程序的时候,有很多数据是在固定范围的,比如性别,只有男和女,那么我们怎么做才能防止别人不传入其他数据呢?
解决:我们可以自定义一个类,私有化构造函数,并在本类中创建本类的对象对外使用
public static final Sex man = new Sex("男")
1.构造函数的私有化,可以防止别人实例化对象,传入其它的值
2.而我们在本类中创建了本类的对象,可以给别人调用使用(调用的就只能是我们实例化的对象,这个时候我们就已经固定了能够使用的值)
3.因为本类的构造函数私有化了,不能创建对象,static是为了不用实例化调用使用的(或者获取枚举类对象)
4.final(什么意思没弄懂,个人理解:可能是为了怕别人乱改数据吧!)
jdk1.5对上面的问题提出了新的解决方案:就是使用枚举类解决(其实原理一样,反编译就可以看出来,只是简化了书写)
枚举的格式:
enum 类名{
//枚举值
}
枚举要注意的细节:
1.枚举类也是一个特殊的类
2.枚举值默认的修饰符是public static final(可以进行反编译验证)
3.枚举值的数据类型是枚举值所属类的类型,然后枚举值是指向了本类的对象的(枚举值也就是成员变量)
4.枚举类的默认的构造函数的修饰符是private
5.枚举值可以自定义自己的成员变量和成员方法
6.枚举值也可以自定义构造函数,但是构造函数必须私有化
7.枚举类可以定义抽象方法,但是枚举值必须实现抽象方法
8.枚举值必须要位于本类的第一个语句
使用场景:一些方法运行时,他需要的数据不能是任意的,这个时候也我们就可以使用枚举
首先我们来看看不使用枚举类的一些实例
不存在抽象方法的实例
class Sex{ public static final Sex man = new Sex("男"); public static final Sex woman = new Sex("女"); String value; private Sex(String value) { this.value = value; } } public class Demo1 { public static void main(String[] args) { System.out.println(Sex.man.value); } }
存在构造方法的实例:
abstract class Sex{ public static final Sex man = new Sex("男") { @Override public void run() { System.out.println("男人再跑。。。"); } }; public static final Sex woman = new Sex("女") { @Override public void run() { System.out.println("女人再跑。。。"); } }; String value; private Sex(String value) { this.value = value; } public abstract void run(); } public class Demo1 { public static void main(String[] args) { //通过调用成员变量获取枚举类对象 Sex man = Sex.man; System.out.println(man.value); man.run(); } }
下面我们来看看是使用枚举类的实例(原理跟上面的两个例子一样):
不存在抽象方法
enum MySex{ man("男"),woman("女"); String value; private MySex(String value) { this.value = value; } } public class Demo2 { public static void main(String[] args) { //获取枚举类对象 MySex man = MySex.man; System.out.println(man.value); } }
存在抽象方法实例:
enum MySex{ man("男") { @Override public void run() { System.out.println("男人再跑。。。"); } },woman("女") { @Override public void run() { System.out.println("女人再跑。。。"); } }; String value; private MySex(String value) { this.value = value; } public abstract void run(); } public class Demo2 { public static void main(String[] args) { //获取枚举类对象 MySex man = MySex.man; System.out.println(man.value); man.run(); } }