java 之 枚举

看了点黑马的视频,边看边试验,结合自己的理解,动手试试。

在这个示例中,将会学到内部类、枚举、接口等等

 

import java.util.Random;

public class Test {

    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        System.out.println(Fire.M4A1);
        System.out.println(Fire.RPG);
        System.out.println(Fire.MP5);
        System.out.println(Fire.SCAR);

        System.out.println(
"----------------------");

        System.out.println(Fire.M4A1.fire());
        System.out.println(Fire.RPG.fire());
        System.out.println(Fire.MP5.fire());
        System.out.println(Fire.SCAR.fire());

        System.out.println(
"----------------------");

        System.out.println(Fire.M4A1.getWeapon());
        System.out.println(Fire.RPG.getWeapon());
        System.out.println(Fire.MP5.getWeapon());
        System.out.println(Fire.SCAR.getWeapon());

    }

    
// 设置开火的声音
    public String setFireSound(String sound) {
        String f 
= "..";
        String a 
= "";
        Random r 
= new Random(); // 种子随便
        int count = r.nextInt(10); // 获取一个10以内的随即整数

        
for (int i = 0; i <= count; i++) {
            
if (r.nextBoolean()) { // 随机boolean值,如果为真,weapon is broken,卡壳了
                a += "" + f; 
            } 
else {
                a 
+= sound + f;
            }

        }
        
return a;
    }

    
// 这是个接口,<武器>接口
    public interface Weapon {
        
public abstract String fire(); // 开火的接口
    };

    
public enum Fire implements Weapon {
        
/*
         * enum类只能实现接口,而没法继承。每个枚举,而有相当于enum的子类
         * 枚举后面的花括号,就相当于类的构造体,里面所实现的方法,可以是重载等等
         
*/
        M4A1 {
            @Override
            
public String fire() {
                
// 既然这个枚举类实现了武器接口,就必须实现它的方法
                String name = Fire.values()[0].toString();
                String fire 
= (new Test()).setFireSound("");
                
return name + " fire-->" + fire;
            }
        },
        SCAR {
            @Override
            
public String fire() {
                
// 既然这个枚举类实现了武器接口,就必须实现它的方法
                String name = Fire.values()[1].toString();
                String fire 
= (new Test()).setFireSound("");
                
return name + " fire-->" + fire;
            }
        },
        MP5 {
            @Override
            
public String fire() {
                
// 既然这个枚举类实现了武器接口,就必须实现它的方法
                String name = Fire.values()[2].toString();
                String fire 
= (new Test()).setFireSound("");
                
return name + " fire-->" + fire;
            }
        },
        RPG {
            @Override
            
public String fire() {
                
// 既然这个枚举类实现了武器接口,就必须实现它的方法
                String name = Fire.values()[3].toString();
                String fire 
= (new Test()).setFireSound("");
                
return name + " fire-->" + fire;
            }
        };

        
/*
         * 枚举的内部方法,每个枚举都会拥有此方法,而每个枚举成员又都可以重载或覆盖此方法
         
*/
        
public String getWeapon() {
            
// this关键字,即当前的枚举
            return this.name() + " weapon";
        }

    }

}

 

输出:

M4A1
RPG
MP5S
CAR
----------------------

M4A1 fire-->咔..咔..咔..哒..咔..

RPG fire-->咔..嘭..咔..嘭..咔..嘭..嘭..嘭..嘭..嘭..

MP5 fire-->咻..咻..咔..咔..咔..

SCAR fire-->嗒..咔..嗒..嗒..嗒..
----------------------
M4A1 weapon
RPG weapon
MP5 weapon

SCAR weapon 

 

起初接触枚举是c#,转到java后一直没有关注过1.5及以后版本的新增特性,看了《thingking in java》结合视频,才发现java的灵活之处,一个枚举都异常灵活强大。

 

使用了enum关键字,即继承Enum类,所以enum只能实现接口,而不能多重继承了。

在枚举成员中,每个枚举成员可以看作一个对象,又像枚举的静态继承类,相当于枚举成员继承了这个枚举,从而可以扩展方法,加上花括号就行,内部怎么写东西,就像对待一般内部类一样。 

  

posted on 2011-05-06 22:50  黑暗伯爵  阅读(352)  评论(0编辑  收藏  举报

导航