【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;
	}
}

结果

在这里插入图片描述

捐赠

若你感觉读到这篇文章对你有启发,能引起你的思考。请不要吝啬你的钱包,你的任何打赏或者捐赠都是对我莫大的鼓励。

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