第5章(4) 可变参数列表

简介:

当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表。可以使用Object数组来实现这样的功能。因为,所有的类都是直接或间接继承于Object类。

1. 在没有可变参数列表的时候,是用数组实现类似的功能,看下面的例子:

class A1{}
 
public class VarArgs {
       static void printArray(Object[] args){
              for(Object obj:args)
                     System.out.print(obj+" ");
              System.out.println();
       }
 
       public static void main(String[] args){
              printArray(new Object[]{
                     new Integer(47),new Float(3.14),new Double(11.11) 
              });
              printArray(new Object[]{"one","two","three"});
              printArray(new Object[]{new A1(),new A1(),new A1()});
       }
}

toString()方法的默认行为是,打印类的名字和对象的地址。

 

2. 有了可变参数列表,就再也不用显式地编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。参数获取的仍然是一个数组。如果你有一组事务,可以当做列表传递,而对于数组,其依旧当作可变参数列表来接受。

如下面的代码:

class A{}
 
public class NewVarArgs {
       static void printArray(Object...args){
              for(Object obj:args)
                     System.out.print(obj+" ");
              System.out.println();
       }
 
       public static void main(String[] args){
              printArray(new Integer(47),new Float(3.14),new Double(11.11));
              printArray(47,
              printArray("one","two","three");
              printArray(new A(),new A(),new A());
              printArray((Object[])new Integer[]{1,2,3,4});
              printArray();
       }
}

3. 可变参数列表也可以使用Object以外的类型,但是传入参数为其他类型时,就会抛出异常。

public class Test {
public static void printArray(Book... books) {
for (int i = 0; i < books.length; i++) {
System.out.println(books[i]);
}
}
 
public static void main(String[] args) {
// printArray(1);//抛异常
printArray(new Book());
}
}
 
class Book {
}

4. 可变参数列表中基本类型和非基本类型可以同时使用:

public class AutoboxingVarargs {
       public static void f(Integer...args){
              for(Integer i:args)
                     System.out.print(i+" ");
              System.out.println();
       }
 
       public static void main(String[] args){
              f(new Integer(1),new Integer(2));
              f(3,4,5,6,7,8,9);
              f(10,new Integer(11),12);
       }
}


5. 重载

编译器会根据参数类型匹配最明确的方法,但可变参数列表仍然是重载变得不安全。

public class OverloadingVarargs {
       static void f(Character...args){
              System.out.print("first ");
              for(Character c:args)
                     System.out.print(c+" ");
              System.out.println();
       }
 
       static void f(Integer...args){
              System.out.print("second ");
              for(Integer i:args)
                     System.out.print(i+" ");
              System.out.println();
       }
      
       static void f(Long...args){
              System.out.print("third ");
              for(Long l:args)
                     System.out.print(l+" ");
              System.out.println();
       }
      
       static void f(Double...args){
              System.out.print("forth ");
              for(Double d:args)
                     System.out.print(d+" ");
              System.out.println();
       }
      
       public static void main(String[] args){
              f('a','b','c');
              f(1);
              f(2,1);
              f(0.1);
              f(0L);
       }
}

上面的例子得到了正确的匹配,但对语句f(),编译器就懵逼了。

我们可能想过在某一个方法中增加一个非可变参数来解决该问题,但这是不被允许的:

public class OverloadingVarargs2 {
       static void f(float i,Character...args){
              System.out.println("first");
       }
 
       static void f(Character...args){
              System.out.println("second");
       }
      
       public static void main(String[] args){
              f(1,'a');
              f('a','b');//Error
       }
}

如果给两个方法都添加一个非可变参数,问题就解决了。即重载的方法必须保持一致的参数形式!

public class OverloadingVarargs2 {
       static void f(float i,Character...args){
              System.out.println("first");
       }
 
       static void f(char c,Character...args){
              System.out.println("second");
       }
      
       public static void main(String[] args){
              f(1,'a');
              f('a','b');
       }
}

 

目录
相关文章
|
4月前
|
存储 运维 安全
Docker化运维:容器部署的实践指南
Docker化运维:容器部署的实践指南
|
7月前
|
人工智能 JavaScript 语音技术
HarmonyOS NEXT AI基础语音服务-语音输入
本案例展示了一个基于AI语音服务的实时语音转文字功能,通过麦克风采集音频并转换为文本。主要步骤包括:申请麦克风权限、初始化语音识别引擎、设置识别回调、配置音频参数及实现UI交互(长按按钮控制录音启停)。代码使用TypeScript编写,涵盖权限管理、引擎生命周期、异常处理等核心环节,确保功能稳定运行。适用于需要实时语音转写的场景,如会议记录、语音输入等。
HarmonyOS NEXT AI基础语音服务-语音输入
|
11月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
359 0
|
分布式计算 Hadoop
Hadoop修改Hadoop配置文件
【4月更文挑战第18天】修改Hadoop配置文件步骤:1) 查找安装目录,如`/usr/local/hadoop`或`/opt/hadoop`;2) 进入`conf`或`etc/hadoop`;3) 编辑主要配置文件如`core-site.xml`, `hdfs-site.xml`, `mapred-site.xml`, `yarn-site.xml`;4) 根据需求修改配置项,如改默认文件系统为`hdfs://localhost:9000/`;5) 保存并退出。注意:修改前备份,确保配置正确,重启Hadoop集群使更改生效。
694 4
Hadoop修改Hadoop配置文件
|
API Python
Python库`openpyxl`是一个用于读取和写入Excel 2010 xlsx/xlsm/xltx/xltm文件的库。
【6月更文挑战第19天】`openpyxl`是Python处理xlsx文件的库,支持读写Excel 2010格式。使用`pip install openpyxl`安装。基本操作包括加载文件、读写单元格、操作行和列。例如,加载Excel后,可以读取单元格`A1`的值,或将“Hello, World!”写入`A1`。还可修改单元格内容,如加1后保存到新文件。更多功能,如样式和公式,见官方文档[1]。 [1]: &lt;https://openpyxl.readthedocs.io/en/stable/&gt;
339 1
|
安全 API 计算机视觉
银行卡四要素验证API接口怎么用
移动互联的大发展时代,网上支付也成了大家日常生活最普遍的支付方式,为了更好地保证支付环境的安全性,银行卡四要素验证是不可或缺的一环
1774 0
银行卡四要素验证API接口怎么用
|
算法 Java C++
【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】
【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】
|
前端开发 搜索推荐 数据可视化
阿里低代码引擎 LowCodeEngine 正式开源!
低代码引擎是一款为低代码平台开发者提供的,具备强大扩展能力的低代码研发框架。
2736 0
阿里低代码引擎 LowCodeEngine 正式开源!
|
存储 传感器 程序员
Livox激光雷达硬件时间同步---PPS方法
在[这篇博客](https://blog.csdn.net/qq_32761549/article/details/125385567?spm=1001.2014.3001.5501)中介绍了Livox的时间硬件同步的3种方法,其中有一种方法是通过PPS信号的方式,信号时间同步。本篇通过STM32 TIM3定时器的更新中断,产生符合要求的PPS信号。
Livox激光雷达硬件时间同步---PPS方法
|
传感器 机器学习/深度学习 存储
利用BEV辅助的立体匹配,助力3D语义场景补全
利用BEV辅助的立体匹配,助力3D语义场景补全
468 0