深入浅出学枚举

 


          我发现我上一篇写得有点像民间教材似口味,就是类似于以前在c语言贴吧上看到的有个哥们发帖教人学c语言用的口语,因为我不只是写给录取的老师看的,也希望路过的学java的朋友在看到我写的文章之后,会稍微有点收获,这样就够了^ ^ 只是我的都是不按学习顺序写的,有一定基础的看客可以看看,高手就忽略吧。

沿用上一篇的风格,这一篇我们讨论一下枚举类型,前几天买了本java核心技术第一卷,打算把基础再再加强,一同购买的还有java版本的数据结构,因为我发现我算法方面很烂,搞安桌的不懂算法,会死人的,时间紧啊,还有两个月就要开第四期的黑马班了,在确认被录取的之后我想把javaee的视频都过一遍,有个大概印象,到时候就可以把更多的心思摆在andriod上。

好的,开始剖析一下java里面的枚举类型吧。在1.5之后,jdk还新增加了一个枚举类型,具体使用方法和C/C++差不多。我在翻看core java 的时候,发现里面对枚举的描述很少,在看高新技术视频和javaweb开发第一天讲的内容的时候,发现里面讲的比较深。说到枚举,在1.5以前,大家往往会用一些别的方法来模仿它的实现,比如有四只动物,dog,cat,monkey,person(姑且算动物吧),要实现类似于枚举的效果,你可以这样做:

public class Animals2 {

    public static final Animals2 Dog = new Animals2()

    public static final Animals2 CAT = new Animals2()

    public static final Animals2 MONKEY = new Animals2()

    public static final Animals2 PERSON = new Animals2()

    private Animals2() {}

在1.5之后,更多的人会选择这样做:

public enum Animals implements behavior{

    DOG,

    CAT,

    MONKEY,

    PERSON,

    Private

}


 

似乎是方便了一点,另外枚举类的构造方法默认是私有的,就是说你无法进行new Animals()操作,枚举类型里面还可以增加方法,比如你可以增加一个这样的方法:

    public void scream() {

       System.out.println("动物在尖叫"); 

    }


 

在调用的时候你会发现每个动物都是调用动物的尖叫,而不是自己独有的,这时候就有必要重写它的方法,代码如下;

public enum Animals{

    DOG() {

       @Override

       public void scream() {

           System.out.println("DOG is screaming");

       }

    },

    CAT() {

       @Override

       public void scream() {

           System.out.println("CAT is screaming");

       }

    },

    MONKEY() {

       @Override

       public void scream() {

           System.out.println("MONKEY is screaming");

       }

    },

    PERSON() {

       @Override

       public void scream() {

           System.out.println("PERSON is screaming");

       }

    };

 

    public void scream() {

       System.out.println("动物在尖叫");

    }

}


根据多态的原则,虚拟机在调用对象方法的时候会先去查看该对象有无此方法(实际上是查看一下该对象方法的列表),再去查看父类的方法列表,所以毫无疑问,会调用已经重写了的scream方法。这些小知识都是视频上讲解过的,我有点好奇,想这枚举类型究竟能不能继承某个类或者实现某个接口呢?答案是,不能继承,但能实现某个接口。比如我写了个behavior接口,里面有一个需要实现的方法,scream(),并让Animals实现了这个接口(先把之前写的scream方法删掉,以免混淆视听),具体代码如下:

public enum Animals implements behavior{

    DOG() {

       @Override

       public void scream() {

           System.out.println("DOG is screaming");

       }

    },

    CAT() {

       @Override

       public void scream() {

           System.out.println("CAT is screaming");

       }

    },

    MONKEY() {

       @Override

       public void scream() {

           System.out.println("MONKEY is screaming");

       }

    },

    PERSON() {

       @Override

       public void scream() {

           System.out.println("PERSON is screaming");

       }

    };

 

    @Override

    public void scream() {

       System.out.println("动物在尖叫");

    }

}

 

//接口代码如下:

public interface behavior {

       public void scream();

}


 

好的,你会发现其实和上一个写的差不多,在这个例子中接口的好处并没有体现出来,要是除了animals类之外,还有一个叫植物的类,一个叫外星生物的类,一个叫外星植物的类,都实现了behavor接口,然后有那么一个方法,该方法会调用传递进来的各种动,植物,外星动,植物的类的对象的scream方法,你唯一能做的就只有把参数的类型写成behavior类型,对不?

这就是接口的好处。

好了,枚举的基础剖析也差不多,再深层次一点的我还没体会出来,另外细想了一下为什么枚举类型不能继承XX类,假设:如果能继承,那么该枚举里面的所有对象都拥有父类自己的方法,这似乎可以说得过去,同时也拥有该父类的字段(field),似乎也没不妥,想不通,这就作为一个问题吧。

    最后用一个普通的类实现了枚举的表面功能,代码如下:

public class Animals2 implements behavior {

    public static final Animals2 Dog = new Animals2(){

       @Override

       public void scream() {

           System.out.println("Dog在尖叫");

           

       }

    };

    public static final Animals2 CAT = new Animals2(){

       @Override

       public void scream() {

           System.out.println("CAT在尖叫");

           

       }

    };;

    public static final Animals2 MONKEY = new Animals2(){

       @Override

       public void scream() {

           System.out.println("MONKEY在尖叫");

           

       }

    };;

    public static final Animals2 PERSON = new Animals2(){

       @Override

       public void scream() {

           System.out.println("PERSON在尖叫");

           

       }

    };;

 

    private Animals2() {}

    @Override

    public void scream() {

       System.out.println("动物在尖叫");

       

    }   

}

//在main方法中你完全可以这样调用:

public static void main(String[] args) {

       Animals2.CAT.scream();

       Animals.CAT.scream();    

    }


 

效果一样吧,枚举类型里面有一些方法是jdk提供的,想自己用普通类实现它全部功能的朋友可以试下,笔者能力有限= =就罢了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值