Java基础(六) 集合之(二) 泛型及枚举类型
- 泛型
- 枚举类型
1. 泛型
对于一个Point类,为了类的可扩展性,其内构造如下:
Class Point{
Object x;
Object y;
}
这样,x和y,既可以赋值为int类型、long类型,也可以赋值为float和double类型。
但于此同时,也存在着一些列的问题:
- 赋值的时候,需要强制类型转换;
- 由于使用Object,需要强制类型转换,强制类型转换不安全。
如果能够传入一个参数,类中的参数类型根据这个参数的类型。根据实参就能确定这个形参的类型,就可以解决这个问题。由此,范型的概念应运而生。
范型可以解决如下的问题:
- 范型可以使类中的属性的类型由外部决定;
- 不需要强制类型转换;
- 泛型可以在编译期间进行类型检查;
- 提供了类型安全的操作。
编译器的泛型兼容性检查:
- 泛型和原始类型的兼容性
1. 原始类型可以引用一个泛型类型
List list = new ArrayList<String>();
2. 泛型类型可以引用一个原始类型的对象
List<String> list = new ArrayList();
- 类型参数不同的泛型类型不能相互引用,不考虑参数类型间的兼容性
List<Object> l = new ArrayList<String>();//false
List list;
List<Object> oList;
List<String> sList=new ArrayList<String>();
olist=slist;//false
oList=list;//true
list=sList;//true
参考例子:GenericTest.java Point2.java PointTest.java
在泛型的对象中,符号?
和<T>
的区别是什么?有哪些区别?
2. 枚举类型
2.1 概要
JDK1.5增添了枚举类型,可以使用enume来进行定义。
public enum Gender{
MALE,FEMAILE;
}
// 其中每一个类型都是该枚举类型的一个实例
使用
Gender g = Gender.MALE;s
遍历
foreach(Gender s:Gender.values())
Enum类和Enum关键字的区别:
- 使用enum关键字定义枚举类型,实际上相当于定义了一个类,此类继承了java.lang.Enum;
- 每一个枚举值都是枚举类型的实例,它们被预设为了public static final;
Enum类只有一个受保护的构造方法:
protected Enum(String name,int ordinal)
ordinal 相当于元素的编号。
每一个枚举元素在定义后,就会自动调用此方法,所有的编号采用自动编号的方式进行(编号从0开始)
使用valueof()的方法,可以找到枚举中的一个指定对象。
public enum Color{
RED,BLUE;
}
//获取枚举类型有两种方法
//1. valueof()函数调用
String name="RED";
Color c1 = Color.valueof(name);
//2. 直接调用
Color c2=Color.RED;
// 第一种方式是根据字符串的值来获取对象的,只要改变字符串的值,我们就可以随意的改变对象;
// 第二种方式是写死了代码,不管如何变化都是取得的Color.RED对象,不会改变。
2.2 枚举的属性和方法
- 枚举内的属性和方法
枚举中可以拥有属性和方法,但是必须在元素声明之后,例如:
public enum Color{
RED,BLUE;
private String name;
public String getName(){return this.name;}
}
- 枚举内的构造方法
- 枚举内的构造方法必须定义在元素列表之后;
- 枚举类型的构造方法只能是private的,不写默认也是private的;
- 元素若需要调用有参数的构造方法,须在构造的时候添加构造参数。
举例如下:
public enum Color{
RED(“红色”),BLUE,BLACK;
private String name;
public String getName(){return this.name;}
Color(String name){this.name=name;}//有参构造函数
Color(){}//无参构造函数
}
- 枚举的使用
//拿到Color中的三个固定对象的其中一个
Color c = Color.RED;
//拿到RED对象中的name属性的值
//这个值打印出来会是 "红色"
//因为是RED这个对象才创建的时候
//通过一个参数的构造器传给属性name的
//在枚举类型中声明元素列表其实就是
//在创建这个枚举类型的固定对象
String name = c.getName();
2.3 枚举的接口和抽象方法
枚举类型隐式继承了Enum,因此无法再继承其他类。(Java内类是单继承的)
枚举实现接口
-
- 和类中一样,在枚举类中统一实现接口内容;
-
- 各个枚举类型分别实现接口内容。
-
第一种方式
public enum Color implements Sofa{
RED,BLUE;
privat String name;
public void sit{
//实现接口内容
}
}
- 第二种方式
//每一个枚举元素对象中单独实现这个接口中的抽象方法 将来每个枚举元素对象调用到的就是自己独立实现的这个sit方法
public enum Color implements Sofa{
RED{
public void sit(){ }
},
BLUE{
public void sit(){ }
};
privat String name;
}
- 枚举中的抽象方法
在一个枚举类型中,可以定义多个抽象方法,但是每个枚举元素都必须实现这个抽象方法。
public enum Color{
RED{
public String getInfo(){return "RED";}
},
BLUE{
public String getInfo(){return "BLUE";}
};
public abstract String getInfo();
}