Day19--可变参数
Day19--可变参数
从 JDK 1.5 开始,Java 支持传递同类型的可变参数给一个方法。
在方法声明中,在指定参数类型后加一个省略号(...)。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
有时候,代码里面的方法重载有很多,看着很繁琐,这就需要我们引入可变参数
以下是 Java 方法定义:
1. `public void method(int i){}`
2. `public void method(int i,int i2){}`
3. `public void method(int i,double i2){}`
例子;设计方法,打印所有传入的参数
能输出列表的每一个元素
package com.liu.www.method;
public class Demo04 {
public static void main(String[] args) {
// 直接通过类名调用静态方法
Demo04.test(1, 2, 3, 4, 5, 6);
// 可以再测试一下参数少于6个的情况
Demo04.test(1, 2, 3);
}
// 使用循环来打印所有传入的参数
public static void test(int ... i) {
for (int value : i) {
System.out.println(value);
}
}
}
以下是一个示例方法:
示例:在输入的值当中打印出最大的值
//方法4:在给出的值当中打印出最大的值
public static int maxValue(int ...a){
if(a.length==0){
System.out.println("没有值输入");
return 0;
}else{
int max=a[0];
for (int i : a) {
if(max<=i){
max=i;
}
}
System.out.println(max);
return max;
}
或者:
public static int maxValue(int... a) {
if (a.length == 0) {
System.out.println("没有值输入");
return 0;
}
int max = a[0];
for (int i : a) {
if (max <= i) {
max = i;
}
}System.out.println(max);
// 由调用者决定是否打印以及如何打印最大值
// 这里可以通过返回max给调用者,由调用者进行打印等操作
// 例如在调用处可以这样:System.out.println(maxValue(1, 2, 3));
// 这里假设直接返回max给调用者,如果不需要返回值可去掉返回语句
return max;
}
需要注意的是:
当输入‘a’的时候,输出结果为:
97
这是为什么?
这是因为在 Java 中,字符类型(char)可以自动转换为整数类型(int),这种转换遵循 ASCII 编码规则(或者说 Unicode 编码,因为 Java 里 char 本质基于 Unicode)。
当你把字符 'a' 传入期望接收 int 类型参数的 maxValue 方法时,Java 会自动将字符 'a' 隐式转换为对应的 ASCII 码值,在 ASCII 编码中,字符 'a' 的编码值就是 97,所以在方法内部,实际上是把 97 当作整数参数进行后续处理了,也就得出了 “输入的最大值是:97” 这样看似 “意外” 的输出结果。
不过虽然代码能运行并输出了结果,但从代码规范和逻辑严谨性角度来说,这样的使用方式是不合适的,因为很可能并不是有意要传递一个字符去参与最大值比较的操作,后续如果期望传入的确实是正常整数参数,这样的代码容易引发混淆和错误,还是应该严格按照方法定义的参数类型要求去传入合适的整数类型参数哦。
我对上面的代码有些疑问:
int max=a[0]。传入的数字成了数组了吗?可以将数组的第一个数定义为max的初始值。
这就涉及到可变参数的本质了。
可变参数的本质
在 Java 中,可变参数(像这里的 int... a)本质上是一种语法糖,它在编译后实际会被当作一个对应类型的数组来处理。例如,当你调用 maxValue(1, 2, 3) 时,编译器会自动将这些参数封装成一个 int 类型的数组,就好像是调用 maxValue(new int[]{1, 2, 3}) 这样的形式。

浙公网安备 33010602011771号