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();
    }
}

猜你喜欢

转载自www.cnblogs.com/zjdbk/p/9025703.html
今日推荐