【java基礎(三十)】可變參和枚舉類

參數數量可變的方法

在Java SE 5.0以前的版本中,每個Java方法都有固定數量的參數。然而,現在的版本提供了可以用可變的參數數量調用的方法(有時稱爲“變參”方法)。
前面已經看到過這樣的方法:printf。例如:

System.out.printf("%d", n);

System.out.printf("%d %s", n, "widgets");

在上面兩條語句中,儘管一個調用包含兩個參數,另一個調用包含三個參數,但它們調用的都是同一個方法。
printf方法是這樣定義的:

public class PrintStream {
	public PrintStream printf(String fmt, Object... args) {
		return format(fmt, args);
	}
}

這裏的省略號…是Java代碼的一部分,它表明這個方法可以接收任意數量的對象。
實際上,printf方法接收兩個參數,一個是格式字符串,另一個是Object[]數組,其中保存着所有的參數。
換句話說,對於printf的實現着來說,Object…參數類型與Object[]完全一樣。
編譯器需要對printf的每次調用進行轉換,以便將參數綁定到數組上,並在必要的時候進行自動裝箱。
用戶自己也可以定義可變參數的方法,並將參數指定爲任意類型,甚至是基本類型。如下程序,其功能爲計算若干個數值的最大值。

public static double max(double... values) {
	double largest = Double.NEGATIVE_INFINITY;
	for (double v : values)
		if (v > largest)
			largest = v;
	return largest; 
}

可以像下面這樣調用這個方法:

double m = max(3.1, 40.4, -5);

編譯器將new double[]{3.1, 40.4, -5}傳遞給max方法。

枚舉類

先看一個典型的枚舉例子:

public enum Size {
	SMALL, MEDIUM, LARGE, EXTRA_LARGE
}

實際上,這個聲明定義的類型是一個類,它剛好有4個實例,在此儘量不要構造新對象。
因此,在比較兩個枚舉類型的值時,永遠不需要調用equals,而直接使用==就可以了。
如果需要的話,可以在枚舉類型中添加一些構造器、方法和域。當然,構造器只是在構造枚舉常量的時候被調用,如:

public enum Size {
	SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");

	private String abbreviation;

	private Size(String abbreviation) {
		this.abbreviation = abbreviation;
	}

	public String getAbbreviation() {
		return abbreviation;
	}
}

所有的枚舉類型都是Enum類的子類。它們繼承了這個類的許多方法。其中最有用的一個是toString,這個方法能夠返回枚舉常量名。例如,Size.SMALL.toString()將返回字符串“SMALL”。
toString的逆方法是靜態方法valueOf,如:

Size s = Enum.valueOf(Size.class, "SMALL");

將s設置成Size.SMALL.
每個枚舉類型都有一個靜態的values方法,它將返回一個包含全部枚舉值的數組。如:

Size[] values = Size.values();

返回包含元素Size.SMALL…四個元素的數組。
ordinal方法返回enum聲明中枚舉常量的位置,位置從0開始計數。如:Size.MEDIUM.ordinal()返回1。

實例

EnumTest.java

package cn.freedompc.enums;

import java.util.Scanner;

public class EnumTest {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE)");
		String input = in.next().toUpperCase();
		Size size = Enum.valueOf(Size.class, input);
		System.out.println("size=" + size);
		System.out.println("abbreviateion=" + size.getAbbreviation());
		if (size == Size.EXTRA_LARGE)
			System.out.println("Good job -- you paid attention to the _.");
	}
	
}

enum Size {
	SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("L");
	
	private String abbreviation;

	private Size(String abbreviation) {
		this.abbreviation = abbreviation;
	}

	public String getAbbreviation() {
		return abbreviation;
	}
}

結果

在這裏插入圖片描述

捐贈

若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章