13.1枚举类型
13.1.1使用枚举类型设置常量
常规定义常量的代码
public interface Constants{
public static final int Constanta_A=1;
public static final int Constants_B=12;
}
枚举类型出现后,逐渐去嗲了上述常量定义方式
public enum Constants{
Constants_A.
Constants_B,
}
enum是定义枚举类型的关键字
1.2深入了解枚举类型
由于枚举类型较传统定义常量的方式,除具有参数类型检测的优势外,还具有其他方面的优势。
用户可以将一个枚举类型看作是一个类,它继承java.lang.Enum类。
枚举类型成员都默认被final、public、static修饰,所有当使用枚举类型成员时直接使用枚举类型名称调用枚举类型成员即可
由于枚举类型对象继承java.lang.Enum类,所有该类中一些操作枚举类型的方法都可以应用到枚举类型。
1.3使用枚举类型的优势
枚举类型声明提供了一种对用户友好的变量定义方式,枚举了某种数据所有尽可能出现的值,总结枚举类型,具有以下特点
类型安全
紧凑有效的数据定义
可以和程序其他部分完美交互
运行效率高
13.2泛型
2.2定义泛型类
其中,T是泛型的名称,代表一种类型。开发者在创建该对象时需要指定T所代表的值与返回的值都以Object类型为主,当需要使用这些实例时,必须正确地将该实例转换为原来的类型,否则在运行时都将会发生ClassCastException异常。
例题6
package 十三;
public class Book<T> { //定义带泛型的Book<T>类
private T bookInfo;//类型形参:书籍信息
public Book(T bookInfo) { //参数为类型形参的构造方法
this.bookInfo =bookInfo; //为书籍信息赋值
}
public T getBookInfo() { //获取书籍信息的值
return bookInfo;
}
public static void main(String[] args) {
Book<String>bookName =new Book<String>("《Java从入门到精通》");
Book<String>bookAuthor =new Book<String>("明日科技");
Book<Double>bookprice =new Book<Double>(69.8);
Book<Boolean>booksource =new Book<Boolean>(true);
System.out.println("书名:"+bookName.getBookInfo());
System.out.println("作者:"+bookAuthor.getBookInfo());
System.out.println("价格:"+bookName.getBookInfo());
System.out.println("是否附赠源码:"+booksource.getBookInfo());
}
}
运行结果
2.3泛型的常规方法
定义泛型类时声明多个类型
class MyClass<T1,T2>{}
其中t1和t2为可能被定义的类型。
这样,在实例化指定类型的对象时就可以指定多个类型。
MyClass<Boolean>,Float>m=new MyClass<Boolean,Float>();
例题7
package 十三;
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>demo =new ArrayClass<String>();
String value[] ={"成员1","成员2","成员3","成员4","成员5"};
demo.setArray(value);
String array[] =demo.getArray();
for(int i=0;i<array.length;i++) {
System.out.println(array[i]);
}}}
运行结果
2.4泛型的高级用法
泛型的高级用法包括限制泛型可用类型和使用类型通配符等。
1.限制泛型可用类型
默认可以使用任何类型来实例化一个泛型类对象,但 Java 中也对泛型类实例的类型作了限制法如下:
class 类名称<T extends anyClass>
其中,anyClass 指某个接口或类
使用泛型限制后,泛型类的类型必须实现或继承 anyClass 这个接口或类。无论 anyClass 是接是类,在进行泛型限制时都必须使用extends关键字
2使用类型通配符
在泛型机制中,提供了类型通配符,其主要作用是在创建一个泛型类对象时限制这个泛想类的类不实现或继承某个接口或类的子类。要声明这样一个对象可以使用“?”通配符来表示,同时使用键字来对泛型加以限制。使用泛型类型通配符的语法如下;
泛型类名称<? extends List> a=null;
其中,<? extends Lis>表示类型未知,当需要使用该泛型对象时,可以单独实例化。例如:
5口
? exiends List> a = null;
a= new A<ArrayList>();a= new A<LinkedList>();
如果实例化没有实现 List 接口的泛型对象,编译器将会报错。例如,实例化 HashMap 对象时,疆将会报错,因为 HashMap 类没有实现 List 接口。除了可以实例化一个限制泛型类型的实例,还可以将该实例放置在方法的参数中
3.继承泛型类与实现泛型接口
定义为泛型的类和接口也可以被继承与实现。例如,让 SubClass 类继承 ExtendClass 的泛型,如下:
class ExtendCiass<T1>()class SubCiass<T1.T2T3> extends ExtendClass<T1>()
如果在SubClass类继承ExtendClass 类时保留父类的泛型类型,需要在继承时指明,如果没有都直接使用“extends ExtendsClass”语句进行继承操作,则 SubClass 类中的T1、T2和T3都会自Object 类型,所以在一般情况下都将父类的泛型类型保留。
定义为泛型的接口也可以被实现。例如,让SubClass 类实现Somelnterface 接口,并继承接口酸型,代码如下:
interface Someinterface<T1>(1class SubClass<T1,T2,T3> implements Someinterface<T1>()
2.5泛型总结