枚举类

1.一个类的对象是有限而且固定的,比如季节类,它只有四个对象。这种实例有限而且固定的类,在java里被称为枚举类。

 

2.枚举类和普通类的区别:

1)枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是Object类,其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。

2)使用enum定义、非抽象的枚举类默认采用final修饰,因此枚举类不能派生子类。(注:抽象的枚举类默认采用abstract修饰,还是可以派生子类。)

3)枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private,如果声明了访问控制符,则只能使用private。

4)枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需显示添加。

 

3.

 
  1. public enum season{

  2. spring,summer,autumn,winter;

  3. }

 

 

 
  1. public class seasontest{

  2. public void info(season a){

  3. switch(a)

  4. {

  5. case spring:

  6. System.out.println("春天");

  7. break;

  8. case summer:

  9. System.out.println("夏天");

  10. break;

  11. case autumn:

  12. System.out.println("秋天");

  13. break;

  14. case winter:

  15. System.out.println("冬天");

  16. break;

  17. }

  18. }

  19. public static void main(String[] args){

  20. for(season x:season.values()){ //通过values方法来返回该类所有的实例

  21. System.out.println(x);

  22. }

  23. new seasontest().info(season.summer); //使用类名.实例的方式访问

  24. }

  25. }

 

 

 

4.

 

 
  1. public enum gender{

  2. man,woman;

  3. private String name;

  4. public void setname(String name){

  5. switch(this){ //this代表调用这个方法的实例,即man或者woman

  6. case man:

  7. if(name.equals("男")){

  8. this.name = name;

  9. }

  10. else{

  11. System.out.println("输入错误");

  12. return;

  13. }

  14. break; //break不能漏

  15. case woman:

  16. if(name.equals("女")){

  17. this.name = name;

  18. }

  19. else{

  20. System.out.println("输入错误");

  21. return;

  22. }

  23. break;

  24. }

  25. }

  26. public String getname(){

  27. return this.name;

  28. }

  29. }

 

 
  1. public class gender2test{

  2. public static void main(String[] args){

  3. gender one = gender.valueOf("man"); //用valueOf方法获取指定的枚举值

  4. one.setname("女");

  5. one.setname("男");

  6. System.out.println(one.getname());

  7. }

  8. }

 

 

 

5.如果将所有的成员变量都使用了final修饰,所以必须在构造器里为这些成员变量指定初始值,因此应该为枚举类显示定义带参数的构造器

 

 
  1. public enum gender{

  2. man("男"),woman("女"); //man("男") 可以看作 public static final gender man = new gender("男");

  3. private final String name;

  4. private gender(String name){

  5. this.name=name;

  6. }

  7. public String getname(){

  8. return this.name;

  9. }

  10. }

 

 


6.枚举类也可以实现一个或多个接口。与普通类一样,枚举类实现一个或多个接口的时候,必须实现该接口的所有抽象方法。

 

 

[java] view plain copy

  1. <code class="language-java">public interface genderexp{  
  2.     void info();  
  3.     default void into(){  
  4.         System.out.println("这是一个默认方法");   
  5.     }  
  6. }</code>  


 

 

 

 

 

 
 
  1. public enum genderbase implements genderexp{

  2. man("男"){

  3. public void info(){

  4. System.out.println("代表男");

  5. }

  6. }, //注意 ,和;

  7. woman("女"){

  8. public void info(){

  9. System.out.println("代表女");

  10. }

  11. };

  12. private String name;

  13. private genderbase(String name){

  14. this.name = name;

  15. }

  16. public String getname(){

  17. return this.name;

  18. }

  19. }


上面代码的粗体字部分看起来有些奇怪:当创建man和woman两个枚举值时,后面有紧跟了一对花括号,这对花括号里面包含了一个info()方法定义。花括号部分实际上是一个类体部分。当创建man、woman枚举值时,并不是直接创建gender枚举类的实例,而是相当于创建了gender的匿名子类的实例。编译程序,可以看见生成了genderbase.class、genderbase$1.class和genderbase$2.class。


7.

 
  1. public enum count{

  2. add{

  3. public double eval(double x,double y){

  4. return x+y;

  5. }

  6. },

  7. reduce{

  8. public double eval(double x,double y){

  9. return x-y;

  10. }

  11. },

  12. mul{

  13. public double eval(double x,double y){

  14. return x*y;

  15. }

  16. },

  17. exc{

  18. public double eval(double x,double y){

  19. return x/y;

  20. }

  21. };

  22. public abstract double eval(double x,double y); //为了让eval()方法有不同的实现,定义一个抽象方法。

  23. public static void main(String[] args){

  24. System.out.println(add.eval(3,4));

  25. System.out.println(reduce.eval(4,3));

  26. System.out.println(mul.eval(3,3));

  27. System.out.println(exc.eval(3,3));

  28. }

  29. }

编译上面程序会生成五个class文件。定义抽象方法时,必须为每个枚举值都提供抽象方法的实现,否则编译错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值