可变参数

可变参数

可变参数

从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. 一个方法最多只能有 1个可变参数;
  2. 可变参数本质是数组,所以 String... args 和 String[] args 不能构成重载;
  3. 不传参数时,可变参数是一个长度为 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") 根据字符串反向获取枚举对象

枚举核心特点

  1. 枚举不能被继承、默认隐式继承 java.lang.Enum;
  2. 构造方法私有化,保证外部无法创建新实例,实现常量固定;
  3. 枚举可以拥有普通成员变量、成员方法、抽象方法。

拓展:带抽象方法的枚举

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

上一篇
下一篇