JAVA-枚举和范型

1、枚举

枚举是一种数据类型,是一系列具有名称的常量的集合。

1.1 使用枚举类型设置常量

package Enum;

interface Constants{
    public static final int Constants_A = 1;
    public static final int Constants_B = 12;
}

public class ConstantTest {
    enum Constants2 {
        Constants_A,Constants_B
    }

    public static void doit(int c){
        switch(c){
            case Constants.Constants_A:
                System.out.println("doit() Constants_A");break;
            case Constants.Constants_B:
                System.out.println("doit() Constants_B");break;
        }
    }

    public static void doit2(Constants2 c){
        switch(c){
            case Constants_A:
                System.out.println("doit2() Constants_A");break;
            case Constants_B:
                System.out.println("doit2() Constants_B");break;
        }
    }

    public static void main(String[] args){
        ConstantTest.doit(Constants.Constants_A);
        ConstantTest.doit(Constants.Constants_B);
        ConstantTest.doit2(Constants2.Constants_A);
        ConstantTest.doit2(Constants2.Constants_B);
    }
}

1.2 深入了解枚举类型

枚举类型的对象继承与java.lang.Enum类,所以有以下的常用的方法:

方法 功能描述 使用方法
values() 将枚举类型成员以数组形式返回 枚举类型名称.values()
valueOf() 实现将普通字符串转换为枚举类型 枚举类型名称.valueOf("abc")
compareTo() 比较两个枚举对象在定义时的顺序 枚举对象.compareTo()
ordinal() 得到枚举成员的位置索引 枚举对象.ordinal()

直接用代码表示:

package Enum;

public class showEnum {
    enum Constants {
        Constants_A,Constants_B,Constants_C,Constants_D
    }

    public static void compare(Constants c){
        Constants enumArray[] = Constants.values();
        for(int i = 0;i<enumArray.length;i++){
            System.out.println(c + "与枚举类型成员变量:"+enumArray[i]+"的比较结果为" + c.compareTo(enumArray[i]));
        }
    }

    public static void showOrdinal(){
        for(int i=0;i<Constants.values().length;i++){
            System.out.println(Constants.values()[i] + "在枚举类型中位置索引值" + Constants.values()[i].ordinal());
        }
    }
    public static void main(String[] args){
        compare(Constants.valueOf("Constants_B"));
        showOrdinal();
    }

}

输出为:

Constants_B与枚举类型成员变量:Constants_A的比较结果为1
Constants_B与枚举类型成员变量:Constants_B的比较结果为0
Constants_B与枚举类型成员变量:Constants_C的比较结果为-1
Constants_B与枚举类型成员变量:Constants_D的比较结果为-2
Constants_A在枚举类型中位置索引值0
Constants_B在枚举类型中位置索引值1
Constants_C在枚举类型中位置索引值2
Constants_D在枚举类型中位置索引值3

1.3 枚举类型的构造方法

枚举类型中可以添加构造方法,但是构造方法必须是private修饰符或者是默认修饰符。

package Enum;

public class EnumConTest {
    enum Constants2{
        Constants2_A("我是枚举成员A"),
        Constants2_B("我是枚举成员B"),
        Constants2_C("我是枚举成员C"),
        Constants2_D(2);


        private String description;
        private int i;
        private Constants2(String description){
            this.description = description;
        }
        private Constants2(int i){
            this.i = i;
        }

        public String getDescription(){
            return this.description;
        }

        public int getI() {
            return this.i;
        }
    }

    public static void main(String[] args){
        Constants2 array[] = Constants2.values();
        for(int i = 0;i < array.length;i++){
            System.out.println(array[i] + "调用getDescription()方法的结果为:" + array[i].getDescription());
        }
        Constants2 cons = Constants2.valueOf("Constants2_D");
        System.out.println(cons + "调用getI()方法的结果为:" + cons.getI());
    }
}

输出结果为:

Constants2_A调用getDescription()方法的结果为:我是枚举成员A
Constants2_B调用getDescription()方法的结果为:我是枚举成员B
Constants2_C调用getDescription()方法的结果为:我是枚举成员C
Constants2_D调用getDescription()方法的结果为:null
Constants2_D调用getI()方法的结果为:2

除了上面这种方式,还可以将方法定义在接口中,使枚举类型实现该接口,然后使每个枚举类型实现接口中的方法:

package Enum;


interface EnumInterface{
    public String getDescription();
    public int getI();
}

public enum AnyEnum implements EnumInterface{

    Constant_A {
        public String getDescription(){
            return ("我是枚举类型A");
        }
        public int getI(){
            return i;
        }
    },

    Constant_B {
        public String getDescription(){
            return ("我是枚举类型B");
        }
        public int getI(){
            return i;
        }
    },

    Constant_C {
        public String getDescription(){
            return ("我是枚举类型C");
        }
        public int getI(){
            return i;
        }
    },
    Constant_D {
        public String getDescription(){
            return ("我是枚举类型D");
        }
        public int getI(){
            return i;
        }
    };

    private static int i = 5;

    public static void main(String[] args){
        AnyEnum array[] = AnyEnum.values();
        for(int i = 0;i<array.length;i++){
            System.out.println(array[i] + "调用getDescription()方法为:" + array[i].getDescription());
            System.out.println(array[i] + "调用getI()方法为:" + array[i].getI());
        }
    }
}

2、范型

范型机制用法如下,这里T代表着一个类型的名称。:
类名<T>

2.1 定义范型类

package Enum;

public class OverClass<T> {
    private T over;
    private T getOver(){
        return this.over;
    }
    public void setOver(T over){
        this.over = over;
    }
    public static void main(String[] args){
        OverClass<Boolean> over1 = new OverClass<Boolean>();
        OverClass<Float> over2 = new OverClass<Float>();
        over1.setOver(true);
        over2.setOver(12.3f);
        System.out.println(over2.getOver());
        System.out.println(over1.getOver());
    }

}

输出为:

12.3
true

使用范型类型定义的类再声明该类对象时可以根据不同的需求指定<T>真正的类型。这种形式可以避免ClassCastException异常。

1.2 范型的常规用法

声明多个类型
在定义范型类时,可以声明多个类型,语法如下:

mutiOverClass<T1,T2>

定义范型类时声明数组类型
定义范型类时也可以声明数组类型:

package Enum;

public class ArrayClass<T> {
    private T[] array;
    public T[] getArray(){
        return array;
    }
    public void setArray(T[] array){
        this.array = array;
    }
    public static void main(String[] args){
        ArrayClass<String> a = new ArrayClass<String>();
        String[] array = {"成员1","成员2","成员3"};
        a.setArray(array);
        for(String str:a.getArray()){
            System.out.println(str);
        }
    }
}

输出为:

成员1
成员2
成员3

集合类声明容器的元素
通过在集合类中应用范型可以使集合类中的元素类型保证唯一性。

package Enum;
import java.util.Map;
import java.util.HashMap;

public class MutiOverClass<K,V> {
    public Map<K,V> m = new HashMap<K,V>();
    public void put(K k,V v){
        m.put(k,v);
    }
    public V get(K k){
        return m.get(k);
    }

    public static void main(String[] args){
        MutiOverClass<Integer,String> mu = new MutiOverClass<Integer, String>();
        for (int i = 0;i < 5;i++){
            mu.put(i,"我是集合类型成员"+i);
        }
        for (int i=0;i<mu.m.size();i++){
            System.out.println(mu.get(i));
        }
    }
}

输出为:

我是集合类型成员0
我是集合类型成员1
我是集合类型成员2
我是集合类型成员3
我是集合类型成员4

其实,上面这种方法纯属多余,因为在JAVA中,这些集合框架都已经被范型化了,可以在主方法中直接使用public Map<K,V> m = new HashMap<K,V>();来创建实例,下表列举了常用的被范型化的集合类:

集合类 范型定义
ArrayList ArrayList<E>
HashMap HashMap<K,V>
HashSet HashSet<E>
Vector Vector<E>
package Enum;

import java.util.*;

public class ListClass {
    public static void main(String[] args){
        List<Integer> a = new ArrayList<Integer>();
        a.add(1);
        for(int i=0;i<a.size();i++){
            System.out.println("获取ArrayList容器的值:" + a.get(i));
        }
        Map<Integer,String> m = new HashMap<Integer,String>();
        for(int i=0;i<5;i++){
            m.put(i,"成员"+i);
        }
        for(int i = 0;i<m.size();i++){
            System.out.println("获取Map容器的值:"+m.get(i));
        }
        Set<Character> set = new HashSet<Character>();
        set.add('一');
        set.add('二');
        for(Character c : set){
            System.out.println("获取Set容器的值:"+c);
        }
    }
}

输出为:

获取ArrayList容器的值:1
获取Map容器的值:成员0
获取Map容器的值:成员1
获取Map容器的值:成员2
获取Map容器的值:成员3
获取Map容器的值:成员4
获取Set容器的值:一
获取Set容器的值:二
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,153评论 1 44
  • 室外温度12度, 炉火上熬着粥, 米粒上下舞动, 100度的欢快, 百分百的自由, 慢摇的英文歌, 填满了整间房,...
    墨默天地阅读 239评论 0 7
  • Blue编辑 物理和数学,化学等学科一样作为我们学生时代的必学学科之一,相信很多读者都受过它的摧残。相...
    4551ff0ad16f阅读 1,640评论 0 0
  • 作为全校最后考完的专业,骄傲了嘛?哈哈 安排的很满,晚上的火车,出发目标昆山。 我是一个闲不下的人,一但闲下来无事...
    南容555阅读 192评论 0 0