可变参数
可变参数
从Java5开始,Java支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。在方法声明中,使用三个连续的省略号
...表示一个可变参数。这个参数底层被视为数组,在方法内部可以像操作数组一样遍历、取值。
基础语法
该方法可接收 0个或多个 字符串参数:
public void method1(String... args) {
// args 本质是 String[] 数组
}
位置限制
可变参数只能作为方法最后一个形参,前面可以搭配普通参数:
// 合法
public void method2(String arg1, String... args) {
}
// 非法:可变参数后面不能再有其他参数
// public void method2(String... args, String arg1) {}
方法重载匹配规则
调用重载方法时,优先匹配固定参数的方法,固定参数匹配优先级高于可变参数。
示例代码:
public class VariableLengthArgument {
public static void printVariable(String... args) {
for (String arg : args) {
System.out.println(arg);
}
}
public static void printVariable(String arg1, String arg2) {
System.out.println(arg1 + arg2);
}
public static void main(String[] args) {
printVariable(); // 匹配可变参数方法
printVariable("a"); // 匹配可变参数方法
printVariable("a", "b"); // 优先匹配固定2个参数的重载方法
printVariable("a", "b", "c"); // 匹配可变参数方法
printVariable("a", "b", "c", "d");
}
}
补充特性
- 一个方法最多只能有 1个可变参数;
- 可变参数本质是数组,所以
String... args和String[] args不能构成重载; - 不传参数时,可变参数是一个长度为 0 的空数组,不会为
null。
枚举 enum
Java 枚举(enum)是一种特殊的数据类型,用于表示一组固定不变的常量。 所有枚举项(RED, GREEN)本质都是 public static final 的枚举类实例。
基础定义
使用 enum 关键字定义枚举:
public enum Color {
// 等价 public static final Color RED = new Color();
RED, GREEN, BLUE;
}
基础使用
public class EnumDemo {
public static void main(String[] args) {
Color color = Color.RED;
System.out.println(color); // 输出:RED
}
}
高级用法:枚举添加成员变量、构造方法
注意:枚举的构造方法强制私有 private,不写修饰符默认也是 private,禁止手动 new 枚举对象。
示例1:颜色绑定十六进制色值
public enum Color {
RED("#FF0000"),
GREEN("#00FF00"),
BLUE("#0000FF");
//Hex 是英文 hexadecimal(十六进制)的缩写
private String hexCode; //十六进制代码
// 私有构造方法
private Color(String hexCode) {
this.hexCode = hexCode;
}
public String getHexCode() {
return hexCode;
}
}
// 测试
public class EnumDemo {
public static void main(String[] args) {
System.out.println(Color.RED.getHexCode()); // 输出:#FF0000
}
}
示例2:季节枚举,重写 toString()
public enum Season {
SPRING("春天", "温暖"),
SUMMER("夏天", "炎热"),
AUTUMN("秋天", "凉爽"),
WINTER("冬天", "寒冷");
private final String name; // 季节名称
private final String description; // 季节特点
// 构造方法
private Season(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return name + "(" + description + ")";
}
}
// 测试
public static void main(String[] args) {
// 遍历所有枚举值 values()
for (Season season : Season.values()) {
System.out.println(season + " 的特点是:" + season.getDescription());
}
// 使用枚举值
Season currentSeason = Season.SUMMER;
System.out.println("当前季节是:" + currentSeason.getName());
}
运行结果:
春天(温暖) 的特点是:温暖
夏天(炎热) 的特点是:炎热
秋天(凉爽) 的特点是:凉爽
冬天(寒冷) 的特点是:寒冷
当前季节是:夏天
枚举搭配 switch(推荐写法)
枚举在 switch 中无需写枚举类前缀,可读性极强:
public static void main(String[] args) {
Color color = Color.BLUE;
switch (color) {
case RED:
System.out.println("这是红色");
break;
case GREEN:
System.out.println("这是绿色");
break;
case BLUE:
System.out.println("这是蓝色");
break;
default:
System.out.println("未知颜色");
}
}
枚举常用内置方法
| 方法 | 作用 |
|---|---|
枚举.values() |
获取所有枚举常量数组,用于遍历 |
枚举.常量.name() |
获取枚举常量名称字符串 |
枚举.常量.ordinal() |
获取枚举序号(从 0 开始) |
Enum.valueOf(枚举类.class, "RED") |
根据字符串反向获取枚举对象 |
枚举核心特点
- 枚举不能被继承、默认隐式继承
java.lang.Enum; - 构造方法私有化,保证外部无法创建新实例,实现常量固定;
- 枚举可以拥有普通成员变量、成员方法、抽象方法。
拓展:带抽象方法的枚举
enum Operation {
ADD {
@Override
public int calc(int a, int b) {
return a + b;
}
},
SUB {
@Override
public int calc(int a, int b) {
return a - b;
}
};
public abstract int calc(int a, int b);
}