是瓦拉格斯 :)

varargs是可变长度参数的缩写,它允许方法接受可变数量的参数(0或更多)。使用varargs,创建需要使用可变数量参数的方法变得非常简单。在Java 5中添加了变量参数的特性。

varargs语法

在数据类型之后,一个vararg由三个省略号(三个点)组成,其一般形式是return_type method_name(data_type ... variableName){}

对静脉曲张的需求

在Java 5之前,如果需要可变数量的参数,有两种方法来处理

如果一个方法可以接受的参数的最大值很小且已知,则可以创建该方法的重载版本。如果方法可以使用的参数的最大数量很大或/且未知,则方法是将这些参数放入数组中,并将它们传递给以数组为参数的方法。这两种方法都很容易出错-每次都要构造一个参数数组,而且很难维护-因为添加新的参数可能会导致编写一个新的重载方法。

静脉曲张的优点

提供了一个简单得多的选择。减少代码,因为不需要编写重载的方法。

静脉曲张的例子public class VarargsExample {

public void displayData(String ... values){

System.out.println("Number of arguments passed " + values.length);

for(String s : values){

System.out.println(s + " ");

}

}

public static void main(String[] args) {

VarargsExample vObj = new VarargsExample();

// four args

vObj.displayData("var", "args", "are", "passed");

//three args

vObj.displayData("Three", "args", "passed");

// no-arg

vObj.displayData();

}}OutputNumber of arguments passed 4var

args

are

passed

Number of arguments passed 3Three args

passed

Number of arguments passed 0

从程序中可以看出,这里使用长度来查找传递给该方法的参数。这是可能的,因为varargs被隐式地作为数组传递。任何作为varargs传递的参数都存储在一个数组中,该数组通过给varargs的名称来引用。在这个程序中,数组名是值。还请注意,方法是以不同数量的参数调用的,首先调用四个参数,然后调用三个参数,然后调用零参数。所有这些调用都由使用varargs的相同方法处理。

带静脉曲张的限制

可以在方法中使用varargs参数的其他参数,但是在这种情况下,varargs参数必须是该方法声明的最后一个参数。void displayValues(int a, int b, int … values) // OK

void displayValues(int a, int b, int … values, int c) // compiler error

varargs的另一个限制是必须只有一个varargs参数。void displayValues(int a, int b, int … values, int … moreValues) // Compiler error

超负荷varargs方法

可以重载接受varargs参数的方法。Varargs方法可以通过-

其vararg参数的类型可能不同。通过添加其他参数。超负荷varargs方法实例public class OverloadingVarargsExp {

// Method which has string vararg parameter

public void displayData(String ... values){

System.out.println("Number of arguments passed " + values.length);

for(String s : values){

System.out.println(s + " ");

}

}

// Method which has int vararg parameter

public void displayData(int ... values){

System.out.println("Number of arguments passed " + values.length);

for(int i : values){

System.out.println(i + " ");

}

}

// Method with int vararg and one more string parameter

public void displayData(String a, int ... values){

System.out.println(" a " + a);

System.out.println("Number of arguments passed " + values.length);

for(int i : values){

System.out.println(i + " ");

}

}

public static void main(String[] args) {

OverloadingVarargsExp vObj = new OverloadingVarargsExp();

// four string args

vObj.displayData("var", "args", "are", "passed");

// two int args

vObj.displayData(10, 20);

// One String param and two int args

vObj.displayData("Test", 20, 30);

}}OutputNumber of arguments passed 4var

args

are

passed

Number of arguments passed 210 20

a TestNumber of arguments passed 220 30

Varargs与超载歧义

在某些情况下,当我们有重载varargs方法时,调用可能是模棱两可的。让我们看看一个例子public class OverloadingVarargsExp {

// Method which has string vararg parameter

public void displayData(String ... values){

System.out.println("Number of arguments passed " + values.length);

for(String s : values){

System.out.println(s + " ");

}

}

// Method which has int vararg parameter

public void displayData(int ... values){

System.out.println("Number of arguments passed " + values.length);

for(int i : values){

System.out.println(i + " ");

}

}

public static void main(String[] args) {

OverloadingVarargsExp vObj = new OverloadingVarargsExp();

// four string args

vObj.displayData("var", "args", "are", "passed");

// two int args

vObj.displayData(10, 20);

// This call is ambiguous

vObj.displayData();

}}

在这个程序中,当我们在没有任何参数的情况下调用Displaydata()方法时,它会抛出错误,因为编译器不确定此方法调用是否用于displayData(String ... values)或displayData(int ... values)

如果我们有重载方法,其中一个方法具有vararg方法的一种类型,另一种方法有一个参数,vararg参数的类型相同,那么我们也有歧义-作为Exp-displayData(int ... values)和displayData(int a, int ... values)

这两个重载的方法总是有歧义的。

java 三个点_Java,参数中的3个点相关推荐

  1. Java私有方法解释_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  2. java虚拟机调优_Java虚拟机中JVM参数调优及其有用的命令

    3.1参数及调优 1.-XX:-HeapDumpOnOutOfMemoryError:当首次遭遇内存溢出时Dump出此时的堆内存. 2.-XX:HeapDumpPath=./java_pid.hpro ...

  3. java 构建者模式_Java方法中的参数太多,第3部分:构建器模式

    java 构建者模式 在我的前两篇文章中,我研究了如何通过自定义类型和参数对象减少构造函数或方法调用所需的参数数量. 在本文中,我将讨论如何使用构建器模式来减少构造器所需的参数数量,并讨论该模式如何甚 ...

  4. java三种注释_Java中三种常见的注释(注解) Annotation

    Java为我们提供了三种Annotation方便我们开发. 1 Override-函数覆写注解 如果我们想覆写Object的toString()方法,请看下面的代码: 1 classAnnotatio ...

  5. java 三目算法_Java 中的三目运算符

    写在前面: 三目运算符是我们经常在代码中使用的,a= (b==null?0:1); 这样一行代码可以代替一个 if-else,可以使代码变得清爽易读.但是,三目运算符也是有一定的语言规范的.在运用不恰 ...

  6. java三目运算_Java中的三目运算符 详解

    对于有些选择分支结构,可以使用简单的条件运算符来代替. 如: if(a min=a; else min=b; 可以用下面的条件运算符来处理 min=(a 其中"(a 条件运算符由两个符号组成 ...

  7. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解

    这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...

  8. java redis缓存理解_Java项目中使用Redis缓存案例

    缓存的目的是为了提高系统的性能,缓存中的数据主要有两种: 1.热点数据.我们将经常访问到的数据放在缓存中,降低数据库I/O,同时因为缓存的数据的高速查询,加快整个系统的响应速度,也在一定程度上提高并发 ...

  9. Java面试没过_Java面试中遇到的坑【填坑篇】

    1.StringBuilder替代String拼接,面试中经常会问到 String,StringBuilder,StringBuffer的区别. 解答:String类作为java语言中最常见的字符串类 ...

最新文章

  1. Qt中的QSpinBox
  2. 深度学习到底有多难?这篇文章带你入门!
  3. 05_学生管理系统,xml读写,布局的综合应用
  4. 理解面向连接和无连接协议之间的区别
  5. Python基础(8)_迭代器、生成器、列表解析
  6. NVLink技术及影响解析
  7. 使用html+css+js实现3D相册
  8. [转]Java游戏引擎
  9. TableCache设置过小造成MyISAM频繁损坏
  10. CEGUI的安装简要总结
  11. 火狐浏览器_全球知名度非常高的火狐浏览器,它好在哪呢?
  12. 大厂必背 MySQL最新面试题 - MySQL数据库优化
  13. Django restframework中Serializer序列化器-用法详解
  14. python爬取本地文本中的成语_Python爬取成语:从3字到12字
  15. CSV文件使用Excel打开
  16. MySQL Join 优化
  17. 常见的服务器报错数字的意思
  18. 全球智能制造产业联盟落地深圳
  19. Python之网络编程
  20. UE4制作星际天空球

热门文章

  1. 不要再用main方法测试代码性能了,用这款JDK自带工具
  2. VB中KeyCode常数用法 VB 按键
  3. C语言文本文件与二进制文件转换
  4. 计算机中隐藏的文件找不到了怎么办,隐藏文件夹找不到了怎么办【图解】
  5. java在文档末尾添加_如何在打开表单后将子文件添加到Word文档的末尾?
  6. 一次较为完整的原生JavaScript AJAX与Java的前后端数据交互
  7. linux下添加apt-get命令,Ubuntu Linux系统下apt-get命令整理
  8. python股票网格交易法详解_股票最全“低买高卖”网格交易大法,值得收藏!
  9. 动环监控系统接线图_机房动环监控系统报价
  10. 达内php第三次月考,达内第三次月考