枚举:jdk1.5以后的新特性
枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则编译就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能,定义一个weekday的类来模拟枚举功能
//weekday星期日用0表示,星期六用6表示,星期日是每个星期的第一天
1·私有构造方法
2·每个元素分别用一个公有的静态成员变量表示
3·可以有若干公有方法或抽象方法
public abstract class WeekDay {
private WeekDay(){}
public final static WeekDay SUN=new WeekDay(){
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}};
public final static WeekDay MON=new WeekDay(){
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}};
public abstract WeekDay nextDay();
/*public WeekDay nextDay(){
if(this==SUN){
return MON;
}else {
return SUN;
}
} */
public String toString(){
return this==SUN?"SUN":"MON";
}
(1)枚举就相当于一个类,其中也可以定义构造方法,变量成员,普通方法和抽象方法。
(2)枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔,把枚举中的成员方法或变量放在枚举元素的前面,编译器会报错。
(3)构造方法必须私有化
带构造方法的枚举
1、构造方法必须定义成私有的
2、如果有多个构造方法,在元素后面加括号选择构造方法
例子:
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay (){System.out.println("1");}
private WeekDay(int day){System.out.println("2");}
}
3、枚举元素MON()和MON的效果一样,都是调用默认的构造方法。
实现带有抽象方法的枚举
public enum TrafficLamp{
RED(30){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},
YELLOW(5){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time=time;}
}
枚举只有一个成员时,就可以作为一种单例的实现方式。
- 静态导入(导入后不用 类.方法,只用方法名) 1.5以后
Import 语句可以导入一个类或某个包中的所有类
Import static 语句可以导入一个类中的某个静态方法或所有静态方法
- Overload 与override的区别
重载:只有返回值不同,不行(同名方法,参数不同)
重写(覆盖):其他类以及实现的类
- 可变参数(只能出现在列表的最后)
位于变量类型和变量名之间,前后无空格都可以;
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。
例:function(int x , int… args)
- 增强for循环
格式:for( (可加修饰)type 变量名:集合变量名){…}
注意:迭代变量必须在()中定义。
集合变量可以是数组或实现了Iterable 接口的集合类
- 自动装箱与自动拆箱 1.5
享元模式 flyweight 有很多个小的对象,有很多属性相同,把它们变成一个对象,不同的属性变成方法的参数(外部状态),那些相同的属性称为这个对象的内部状态。
Ineteger i1=12;
Ineteger i2=12;
System.out.println(i1==i2);
//true
//在一个字节类内(-128~127)小的整数在装箱的时候装成同一个对象
Ineteger i3=128;
Ineteger i4=128;
System.out.println(i3==i4);
//false
Integer i5= Integer.valueOf(3);
Integer i6 = Integer.valueOf(3);
System.out.println(i5==i6);
//true