Java基础之枚举
可变参数的特点:
只能出现在参数列表的最后;
...位于变量类型和变量名之间,前后有无空格都可以;
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
增强for循环:迭代的集体变量可以是数组或者是实现了Iterable接口的集合类,还可以在类型声明前加修饰符如final
写书的人在哪里看到的呢,知识的源头在java语言规范里。
基本类型的自动拆箱与装箱:
Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2);// true
Integer i3 = 137;
Integer i4 = 137;
System.out.println(i3 == i4);// false
Integer i5 = Integer.valueOf(3);
Integer i6 = Integer.valueOf(3);
System.out.println(i5 == i6);//true
如果装箱的整数在一个字节之内,即-128-127都会缓存起来,它认为这些小的整数使用的频率会很高。这就是(共享)享元(flyweight)设计模式,有很多小的对象,有很多属性相同,那些不同的属性变成方法的参数,称之为外部状态,那些相同的属性称之对象的内部状态。
有些东西不需要别人教,自己好奇试一下就懂了。
用普通类模拟枚举功能:
public abstract class WeekDay {
private WeekDay() {// 私有构造方法
}
public final static WeekDay SUN = new WeekDay() {// 公有静态成员变量
@Override
public WeekDay nextDay() {
return MON;
}
};
public final static WeekDay MON = new WeekDay() {
@Override
public WeekDay nextDay() {
return SUN;
}
};
public abstract WeekDay nextDay();// 抽象方法用来避免大量的ifelse语句
// public WeekDay nextDay() {
// if (this == SUN) {
// return MON;
// } else {
// return SUN;
// }
// }
public String toString() {
return this == SUN ? "SUN" : "MON";
}
}
public class EnumTest {
public static void main(String[] args) {
WeekDay1 weekDay = WeekDay1.MON;
System.out.println(weekDay.nextDay());
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2);
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(WeekDay.valueOf("SUN"));
System.out.println(WeekDay.values().length);
}
public enum WeekDay {
SUN, MON, TUE, WED, THI, FRI, SAT
}
}
public enum WeekDay {
SUN(1), MON(), TUE, WED, THI, FRI, SAT;
private WeekDay() {
System.out.println("first");
}
private WeekDay(int day) {
System.out.println("second");
}
}
在枚举元素后加括号就表示调用哪种形式的构造方法,没有为什么,只是一种形式而已,而且是最容易想到或者接受的形式而已;
带有抽象方法的枚举
public enum TrafficLamp {
RED(30) {
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(45) {
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5) {
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time) {
this.time = time;
}
}
枚举只有一个成员时,就可以作为一种单例的实现方式