寫在之前
以下是《Java8編程入門官方教程》中的一些知識(shí),如有錯(cuò)誤爱葵,煩請(qǐng)指正施戴。涉及的程序如需下載請(qǐng)移步http://down1.tupwk.com.cn/qhwkdownpage/978-7-302-38738-1.zip
枚舉
定義新的數(shù)據(jù)類型的命名常量列表。一般使用枚舉常量使用大寫萌丈。這是因?yàn)槊杜e經(jīng)常代替final變量赞哗,而final變量通常是大寫的,所以程序員自然也習(xí)慣對(duì)枚舉常量使用大寫辆雾。Java將枚舉實(shí)現(xiàn)為類類型肪笋,盡管不會(huì)使用new實(shí)例化枚舉,但是可以給枚舉提供構(gòu)造函數(shù)度迂,添加實(shí)例變量和方法藤乙,甚至實(shí)現(xiàn)接口。
// 枚舉的創(chuàng)建和基本應(yīng)用
// 聲明一個(gè)枚舉
enum Transport {
CAR, TRUCK, AIRPLANE, TRAIN, BOAT //枚舉常量
}
class EnumDemo {
public static void main(String args[])
{
Transport tp; //聲明一個(gè)Transport引用
tp = Transport.AIRPLANE; //為tp賦值常量AIRPLANE
// Output an enum value.
System.out.println("Value of tp: " + tp);
System.out.println();
tp = Transport.TRAIN;
// Compare two enum values.
if(tp == Transport.TRAIN) //比較兩個(gè)Transport對(duì)象是否相等
System.out.println("tp contains TRAIN.\n");
//使用枚舉控制switch語(yǔ)句
switch(tp) {
case CAR:
System.out.println("A car carries people.");
break;
case TRUCK:
System.out.println("A truck carries freight.");
break;
case AIRPLANE:
System.out.println("An airplane flies.");
break;
case TRAIN:
System.out.println("A train runs on rails.");
break;
case BOAT:
System.out.println("A boat sails on water.");
break;
}
}
}
value()和valueOf()方法
所有枚舉類型自動(dòng)定義以上兩種方法惭墓。
public static enum-type[] values()//返回一個(gè)枚舉常量列表數(shù)組
public static enum-type[] valuesOf(String str)//返回一個(gè)枚舉常量坛梁,傳遞給字符串
// Use the built-in enumeration methods.
// An enumeration of Transport varieties.
enum Transport {
CAR, TRUCK, AIRPLANE, TRAIN, BOAT
}
class EnumDemo2 {
public static void main(String args[])
{
Transport tp;
System.out.println("Here are all Transport constants");
// use values()
Transport allTransports[] = Transport.values();
for(Transport t : allTransports)
System.out.println(t);
System.out.println();
// use valueOf()
tp = Transport.valueOf("AIRPLANE");
System.out.println("tp contains " + tp);
}
}
構(gòu)造函數(shù)、方法腊凶、實(shí)例變量和枚舉
枚舉常量都是一個(gè)其枚舉類型的對(duì)象划咐。
枚舉和final共存:枚舉適合必須由標(biāo)識(shí)符表示的條目列表的情況;final變量適合于常量值可用于多處地方的情況吭狡。
兩點(diǎn)限制:枚舉不能繼承另一個(gè)類尖殃;enum不能是超類。
// Use an enum constructor, instance variable, and method.
enum Transport {
CAR(65), TRUCK(55), AIRPLANE(600), TRAIN(70), BOAT(22);
private int speed; // typical speed of each transport 添加一個(gè)實(shí)例變量
// Constructor
Transport(int s) { speed = s; }
int getSpeed() { return speed; } //添加一個(gè)方法
}
class EnumDemo3 {
public static void main(String args[])
{
Transport tp;
// Display speed of an airplane.
System.out.println("Typical speed for an airplane is " +
Transport.AIRPLANE.getSpeed() +
" miles per hour.\n");
// Display all Transports and speeds.
System.out.println("All Transport speeds: ");
for(Transport t : Transport.values())
System.out.println(t + " typical speed is " +
t.getSpeed() +
" miles per hour.");
}
}
枚舉繼承enum
所有枚舉都自動(dòng)繼承java.lang.Enum
划煮,定義了很多方法送丰,可供所有枚舉使用,下面介紹最為常用的兩個(gè)弛秋。
final int ordinal() //返回枚舉常量的順序值
final int compareTo(enum-type e) //比較同一個(gè)枚舉中兩個(gè)枚舉常量的順序值
// Demonstrate ordinal() and compareTo().
// An enumeration of Transport varieties.
enum Transport {
CAR, TRUCK, AIRPLANE, TRAIN, BOAT
}
class EnumDemo4 {
public static void main(String args[])
{
Transport tp, tp2, tp3;
// Obtain all ordinal values using ordinal().
System.out.println("Here are all Transport constants" +
" and their ordinal values: ");
for(Transport t : Transport.values())
System.out.println(t + " " + t.ordinal());
tp = Transport.AIRPLANE;
tp2 = Transport.TRAIN;
tp3 = Transport.AIRPLANE;
System.out.println();
// Demonstrate compareTo()
if(tp.compareTo(tp2) < 0)
System.out.println(tp + " comes before " + tp2);
if(tp.compareTo(tp2) > 0)
System.out.println(tp2 + " comes before " + tp);
if(tp.compareTo(tp3) == 0)
System.out.println(tp + " equals " + tp3);
}
}
為了加深理解器躏,看一個(gè)更加具體使用的例子--使用計(jì)算機(jī)控制交通燈
// A simulation of a traffic light that uses
// an enumeration to describe the light's color.
// An enumeration of the colors of a traffic light.
enum TrafficLightColor {
RED, GREEN, YELLOW
}
// A computerized traffic light.
class TrafficLightSimulator implements Runnable {
private Thread thrd; // holds the thread that runs the simulation
private TrafficLightColor tlc; // holds the current traffic light color
boolean stop = false; // set to true to stop the simulation
boolean changed = false; // true when the light has changed
TrafficLightSimulator(TrafficLightColor init) {
tlc = init;
thrd = new Thread(this);
thrd.start();
}
TrafficLightSimulator() {
tlc = TrafficLightColor.RED;
thrd = new Thread(this);
thrd.start();
}
// Start up the light.
public void run() {
while(!stop) {
try {
switch(tlc) {
case GREEN:
Thread.sleep(10000); // green for 10 seconds
break;
case YELLOW:
Thread.sleep(2000); // yellow for 2 seconds
break;
case RED:
Thread.sleep(12000); // red for 12 seconds
break;
}
} catch(InterruptedException exc) {
System.out.println(exc);
}
changeColor();
}
}
// Change color.
synchronized void changeColor() {
switch(tlc) {
case RED:
tlc = TrafficLightColor.GREEN;
break;
case YELLOW:
tlc = TrafficLightColor.RED;
break;
case GREEN:
tlc = TrafficLightColor.YELLOW;
}
changed = true;
notify(); // signal that the light has changed
}
// Wait until a light change occurs.
synchronized void waitForChange() {
try {
while(!changed)
wait(); // wait for light to change
changed = false;
} catch(InterruptedException exc) {
System.out.println(exc);
}
}
// Return current color.
synchronized TrafficLightColor getColor() {
return tlc;
}
// Stop the traffic light.
synchronized void cancel() {
stop = true;
}
}
class TrafficLightDemo {
public static void main(String args[]) {
TrafficLightSimulator tl =
new TrafficLightSimulator(TrafficLightColor.GREEN);
for(int i=0; i < 9; i++) {
System.out.println(tl.getColor());
tl.waitForChange();
}
tl.cancel();
}
}