A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨庆雷 中级黑马   /  2014-8-13 13:47  /  1722 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于枚举类一直有点不是很清楚,查了下资料,总结了一下。
首先枚举的类修饰符,枚举类的修饰符只有一个public,还有一个修饰符是默认的final(只是默认,不可以显式表示,如果显式表示会有这么一个错:
Illegal modifier for the enum Operation; only public is permitted,也就是说枚举类的修饰符只能是public),也就是不能被其他类继承,
其构造函数的修饰符只能用private修饰(如果不加,默认还是private),也就是说不能被其他类创建对象。

枚举类可以有抽象方法,有了抽象方法,那么这个枚举类也就是抽象的了,你默认的final修饰符改为abstract(但还是不能加显式加到类前面去修饰,只是默认),既然是抽象类,那么就不能创建实例,只能通过其实现类来创建实例,在这就用匿名内部类来表示,PLUS = new Operation (){},在枚举类表示为PLUS(){},然后重写抽象方法;
  1. public enum Operation {
  2.         PLUS (){

  3.                 @Override
  4.                 public void numble(int x,int y) {
  5.                         // TODO Auto-generated method stub
  6.                         System.out.println(x+y);
  7.                 }
  8.                
  9.         },
  10.         SUB(){

  11.                 @Override
  12.                 public void numble(int x,int y) {
  13.                         // TODO Auto-generated method stub
  14.                         System.out.println(x-y);
  15.                 }
  16.                
  17.         };
  18.        
  19.         public abstract void numble(int x,int y);
  20.        
  21.         public static void main(String[] args) {
  22.                 Operation.PLUS.numble(3, 6);
  23.                 Operation.SUB.numble(3, 6);
  24.         }
  25. }
复制代码
都是自己总结的,如果有什么错误,欢迎批评指正


评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

4 个回复

正序浏览
杨庆雷 发表于 2014-8-13 20:01
说的很全面,很棒,我之前有两点疑惑:
1,类的修饰符,有的资料说有个默认的final   所以枚举就不能被其 ...

枚举当然不能继承了啊,本身就包含自己的实例对象,所以那些修饰符都是默认存在的,为什么纠结这些。。。
回复 使用道具 举报
格子、 发表于 2014-8-13 19:45
枚举
枚举的由来
        在java中有一些方法只接收特定的值,不能是其他的值。Java为了解决这类问题,在JDK1.5之 ...

说的很全面,很棒,我之前有两点疑惑:
1,类的修饰符,有的资料说有个默认的final   所以枚举就不能被其他类继承了,但是这个final又不能写上去,    因为枚举类只能有一个修饰符,就是public。
2,构造函数的修饰符,只可以是private,也可以不加,但默认就是private,而不是default
不知版主对这两点有没有什么其他的看法
(前两天被你扔去吹水,刚回来又被涛哥丢过去了,好悲剧啊)
回复 使用道具 举报
格子、 发表于 2014-8-13 19:45
枚举
枚举的由来
        在java中有一些方法只接收特定的值,不能是其他的值。Java为了解决这类问题,在JDK1.5之 ...

说的很全面,很棒,我之前有两点疑惑:
1,类的修饰符,有的资料说有个默认的final 不能被其他类继承,但是这个final又不能写上去,因为枚举类只能有一个修饰符
回复 使用道具 举报
枚举
枚举的由来
        在java中有一些方法只接收特定的值,不能是其他的值。Java为了解决这类问题,在JDK1.5之后出现了枚举,用来表示特定的值
并且在编译时期就有所体现。
枚举的定义
        枚举通过在关键字 enum 定义。
        示例:
        enum WeekDay
        { SUN,MON,TUE,WEN,THU,FRI,SAT}
        特定的值都在{}中定义,默认都为公有静态的静态变量,且如果最后一个元素后定义方法必须加分号,否则可加可不加。
枚举的使用
        枚举和类其实差不多,可以定义方法、抽象方法、构造函数或者实现接口、继承等,但是也有一些不同之处
        1.每个元素都有一个默认的编号,从0开始。
        2.每个元素默认都是枚举子类的实例化对象,是以类似内部类的形式实现的。
        3.如果不指定构造函数,元素默认自带一个空参的构造函数。
        4.构造函数必须定义在元素列表后且必须私有。
        5.如果枚举内定义了抽象函数,元素必须实现。
        6.枚举类的父类是java.lang.Enum<E>。
枚举常用方法
        String name() 返回枚举元素的名称
        int        ordinal() 返回枚举元素的角标
        static <T extends Enum<T>> valueOf(String name) 返回带指定名称的指定枚举类型的枚举常量,一般の指定名称。
        values() 返回包含枚举所有元素的集合,主要用于遍历枚举元素,但Java标准的API未定义。
枚举的使用实例
        实例1:
        package com.itheim.day1;
        //枚举示例
        public class EnumDemo {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                //获得枚举对象
                WeekDay weekDay = WeekDay.FRI;
                //遍历枚举
                for(WeekDay weekday : weekDay.values())
                {
                        System.out.println("第一个是"+weekday.ordinal()+"星期:"+weekday.name());
                }
                //将常量值赋给枚举对象
                WeekDay weekDay2 = WeekDay.valueOf("FRI");
                System.out.println(weekDay2);
                //遍历枚举元素
                System.out.println(weekDay2.values().length);

        }
        //定一个枚举
        public enum WeekDay
        {
                SUN,MON,TUE,WEN,THU,FRI,SAT
        }

}

示例2:交通灯枚举
        package com.itheim.day1;

        public class TrafficLamp {

        public static void main(String[] args) {
                // TODO Auto-generated method stub

        }
        //定义一个交通灯枚举
        public enum Lamp
        {
                RED(10)
                {

                        @Override
                        public Lamp nextLampEnum() {
                                // TODO Auto-generated method stub
                                return YELLOW;
                        }
                       
                }, GREEN(15) {
                        @Override
                        public Lamp nextLampEnum() {
                                // TODO Auto-generated method stub
                                return RED;
                        }
                }, YELLOW(5) {
                        @Override
                        public Lamp nextLampEnum() {
                                // TODO Auto-generated method stub
                                return GREEN;
                        }
                };
                //为枚举类定义抽象函数
                private Lamp(int time)
                {
                        System.out.println("先把所有枚举元素加载进内存"+this.time());
                }

                private String time() {
                        // TODO Auto-generated method stub
                        return null;
                }
                //定义抽象方法
                public abstract Lamp nextLampEnum();
        }
}

枚举总结:
        1.枚举是一个特殊的类。
        2.当枚举只有一个元素时就是一个单例设计模式。
        3.枚举的实例变量是把所有元素加载进内存实例,耗费资源,每个元素都是一个枚举的子类内部类实例对象。
跟楼主交流一下哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马