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

输出为:

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

2、范型

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

2.1 定义范型类

package Enum;

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

}

输出为:

12.3
true

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

1.2 范型的常规用法

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

mutiOverClass

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

package Enum;

public class ArrayClass {
    private T[] array;
    public T[] getArray(){
        return array;
    }
    public void setArray(T[] array){
        this.array = array;
    }
    public static void main(String[] args){
        ArrayClass a = new ArrayClass();
        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 {
    public Map m = new HashMap();
    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 mu = new MutiOverClass();
        for (int i = 0;i < 5;i++){
            mu.put(i,"我是集合类型成员"+i);
        }
        for (int i=0;i

输出为:

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

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

集合类 范型定义
ArrayList ArrayList
HashMap HashMap
HashSet HashSet
Vector Vector
package Enum;

import java.util.*;

public class ListClass {
    public static void main(String[] args){
        List a = new ArrayList();
        a.add(1);
        for(int i=0;i m = new HashMap();
        for(int i=0;i<5;i++){
            m.put(i,"成员"+i);
        }
        for(int i = 0;i set = new HashSet();
        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容器的值:二

你可能感兴趣的:(JAVA-枚举和范型)