第十三章 枚举类型与泛型

枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中。

 13.1  枚举类型

        使用枚举类型,可以取代前面学习过的定义常量的方式,同时枚举类型还赋予程序在编译时进行检查的功能。

13.1.1        使用枚举类型设置常量

        设置常量时,我们通常将常量放置在接口中,这样在程序中就可以直接使用。该常量不能被修改,因为在接口中定义常量时,该常量的修饰符为final与static。常规定义常量的代码如下:

public Interface Constans{

        public static final int Constans_A=1;

        public static final int Constans_B=12;

}

 枚举类型出现后,逐渐取代了上述常量定义方式。使用枚举类型定义常量的语法如下:

public enum Constans{

        Constans_A,

        Constans_B,

}

其中,enum是定义枚举类型的关键字。

package 第十三章;
 
public interface SeasonInterface {//接口类
    //在接口中定义了四个常量
     final int spring=1;
     final int summer=2;
     final int autumn=3;
     final int winter=4;    
}
枚举类型定义如下:
package 第十三章;
 
public enum SeasonEnum {//枚举类  enun里面默认包含了 public final static
    spring("万物复苏"),//注意参数后面不是分后而是逗号
    summer("烈日炎炎"),
    autumn("秋草枯黄"),
    winter("白雪皑皑"),
}
使用枚举类型定义常量的话 可以剪短代码量

下面使用例题来解释:

//接口定义
public interface SeasonInterface {//接口类
    //在接口中定义了四个常量
     final int spring=1;
     final int summer=2;
     final int autumn=3;
     final int winter=4;    
}
//枚举类型

第十三章 枚举类型与泛型_第1张图片
 第十三章 枚举类型与泛型_第2张图片 

秋天
春天
13.1.2深入了解枚举类型
枚举类型较传统定义常量的方式,除具有参数类型检测的优势外  还有其他的又是,,用户可以将一个枚举类型看作一个类,它继承于java.lang.Enum类,当定义了一个枚举类型时,没一个枚举类型的成员都看作是一个实例,这些枚举类型的成员都默认为final  public static修饰 所以当使用枚举类型成员是可以直接使用枚举类型的名称调用枚举类型成员即可  所以该类中的一些操作枚举类型的方法都可以应用到枚举类型中  常用方法如下: 

 

 

第十三章 枚举类型与泛型_第3张图片
 

1.values()方法

枚举类型实例包含一个values()方法,该方法将没居中的所有枚举类型值以数组的形式返回  代码如下:

package 第十三章;
 
public enum SeasonEnum {//枚举类  enun里面默认包含了 public final static
    spring("万物复苏"),//注意参数后面不是分后而是逗号
    summer("烈日炎炎"),
    autumn("秋草枯黄"),
    winter("白雪皑皑");
    //枚举类的构造方法只能是私有的
    private String introduce;
    public String getIntroduce() {
return introduce; 
    }
        private SeasonEnum() {
        }
        private SeasonEnum(String introduce) {
            this.introduce = introduce;
    }
}

public class SeasonDemo1 {
    public static void main(String[] args) {
        SeasonEnum[] seasons =     SeasonEnum.values();//SeasonEnum.values是获取SeasonEnum的最初值  就是将SeasonEnum文件中的值传入给该数组  然后再for循环打印出来
        for(int i = 0; i             SeasonEnum temp =seasons[i];
            System.out.println(temp+temp.getIntroduce());
        }
    }
 
}

第十三章 枚举类型与泛型_第4张图片 

spring万物复苏
summer烈日炎炎
autumn秋草枯黄

winter白雪皑皑

2.valueOf()方法与compareTo方法()
枚举类型中静态方法valueOf()方法可以将普通字符串转换为枚举类型,而compareTo方法用于比较两个枚举类型对象定义是的顺序

3.ordinal()方法
枚举类型中的ordinal()方法用于获取某个枚举对象的位置索引值

4.枚举类型中的构造方法
在美剧类型中可以添加构造方法但是规定这个构造方法必须配private修饰符所修饰枚举类型定义的构造方法语法如下

//package 第十三章;

public enum SeasonEnum {//枚举类  enun里面默认包含了 public final static
    spring("万物复苏"),//注意参数后面不是分后而是逗号
    summer("烈日炎炎"),

    autumn("秋草枯黄"),
    winter("白雪皑皑");
    //枚举类的构造方法只能是私有的
    private String introduce;
    public String getIntroduce() {
        return introduce; 
    }
        private SeasonEnum() {
}
        private SeasonEnum(String introduce) {
            this.introduce = introduce;
    }
}
package 第十三章;
 public class SeasonDemo1 {
    public static void main(String[] args) {
        SeasonEnum[] seasons =     SeasonEnum.values();//SeasonEnum.values是获取SeasonEnum的最初值  就是将SeasonEnum文件中的值传入给该数组  然后再for循环打印出来
        for(int i = 0; i             SeasonEnum temp =seasons[i];
            System.out.println(temp+temp.getIntroduce());
        }
    }

13.1.3 使用枚举类型的优势 

枚举类型声明提供了一种对用户友好的变量定义方式,枚举了某种数据所有尽可能出现的值,总结枚举类型,具有以下特点:

类型安全

紧凑有效的数据定义

可以和程序其他部分完美交互

运行效率高

 

13.2泛型
泛型实质上就是程序员定义安全的类型,在没有出现泛型之前,java也提供了队Object类型的引用“任意化” 操作 这种任意话操作就是对object类型引用进行向上或者向下的转型操作,但某些强制类型转换的错误也许不会背编译器捕捉,而运行后出现的异常,可见强制类型转换存在安全隐患,所以在此提供了泛型机制,

13.2.2定义泛型类

Object类为最上层的父类,很多程序员为了让程序更为通用,设计程序的时候通常使用传入的值与返回的值都已Object类型为主。当需要使用这些实例的时候,必须正确地将该实例转换为原来的实例,否则在运行是会发生ClassCastException异常

为了预防这种问题 java提供了泛型机制 

类名
其中T是泛型地名称 , 代表了某一种类型。开发者在创建该类对象时 需要制定T代表了具体哪种类型,如果不指定的话 T则采用了Object类型

如以下代码所示:

第十三章 枚举类型与泛型_第5张图片  

代码中一共new了四个对象  两个 String类型 一个double类型 一个boolean类型   依次定义 然后输出    使用泛型定义额类在生命该类对象时  可以根据不同地需求指定真正地类型 ,而是在使用类中的方法传递或返回 数据类型时将不再进行类型转换操作,而是使用在生命泛型类对象是“<>”符号中设置数据类型

13.2.3 泛型的常规用法
1. 在定义泛型类时,可以声明多个类型 代码如下
class MyClass{}
其T1,T2是可以背定义的类型

这样的话既可以一下实例化多个类型  代码如下

MyClass m = new MyClass ();
2.  定义泛型类 时声明数组类型  代码如下

package 第十三章;
public class ArrayClass {
private T[]array;//创建泛型的数组v
public T[]getArray(){//使用get方法来读取
    return array;//返回array
}
public void steArray(T[]array) {//使用set方法
    this.array=array;//this关键字给array赋值
}

public static void main (String[]args) {
    ArrayClassdemo=new  ArrayClass();//创建泛型为String类型的独享
    String value[]= {"成员1","成员2","成员3","成员4","成员5",};//添加数据
    demo.steArray(value);
    String array[] = demo.getArray();//使用get方法读取读取然后一次遍历输出
    for(int i = 0;i         System.out.println(array[i]);
    }
}
}

第十三章 枚举类型与泛型_第6张图片 

3.集合类声明容器的元素


JDK中的集合接口,集合类都被定义了泛型,其中List的泛型E实际上就是element元素的首字母Map的泛型 K和V就是key键和value键的首字母。常用的被泛型化的集合类如下:

第十三章 枚举类型与泛型_第7张图片

13.2.4 泛型的高级用法

13.2.5 泛型总结

泛型的类型参数只能是类类型,不可以是简单型,如A这种泛型定义就是错的

泛型的类型个数可以是多个

可以使用extends关键字限制泛型的类型

可以使用通配符限制泛型的类型

 

 

你可能感兴趣的:(其他)