http://developer.51cto.com/art/200906/132089.htm

Java可变参数

Java语言在JDK1.5中首次推出Java可变参数,variable arguments,或简称varargs。这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性。但可变参数的应用并不像想象的那么简单,使用时有其特殊要求和局限性。

重载的最好例子

读者朋友可能有这样的编程经历:在编写一个方法时,其参数随着程序运行的条件而变化,在编译期间无法确定。具体地讲,例如编写一个打印参加聚会party的程序,其中方法printInvitation()将根据作为参数的参加人姓名,打印邀请卡。但这个参数的数量事先并不确定。当然可以编写许多重载的方法来解决这个问题,如:
void printInvitation(String name);
void printInvitation(String name1, String name2);
void printInvitation(String name1, String name2, String name3);
...
问题是编写多少个重载的方法才可以解决给所有参加者打印邀请卡?也许需要改变您的程序设计,而使用数组或者链接表了。
应用可变参数可以方便、灵活地解决这类问题。例如:
//完整程序存在本书配套资源目录Ch12名为VarargsTest.java
void printInvitation(String...names) {
for (String name : names) {
makeCard(name);             //调用方法按照姓名打印邀请卡
System.out.println("Recording info: invitation card has been printed for " + name);
}
}
这里,(String...names)便是可变参数。它包括从0到任意个相同类型的参数。在编译期间,这个可变参数将被转换为字符串数组形式,即:
void printInvitation(String[] names)
如下是调用这个方法的例子:
printInvitation("李刚", "David Smith");
printInvitation("Greg Wu", "Paul Nguyen", "Liu Wei", "张新");
printInvitation();          //无参数
当在无参数情况下调用这个方法时,将不执行任何这个方法中的代码。
如下是运行结果:
Recording info: invitation card has been printed for 李刚
Recording info: invitation card has been printed for David Smith
Recording info: invitation card has been printed for Greg Wu
Recording info: invitation card has been printed for Paul Nguyen
Recording info: invitation card has been printed for Liu Wei
Recording info: invitation card has been printed for 张新

怎样工作

Java可变参数也不神秘。实际上,JVM将根据程序中调用这个方法时提供的参数数量,来装载和运行它。
可变参数的简单语法格式为:
methodName([argumentList], dataType...argumentName);
其中:
argumentList——普通参数,可选项。
dataType——数据类型或者类。自动转换成dataType代表的数组。
...——Java的操作符。表示0到多个。必须是3个点。
argumentName——参数名。
注意,可变参数必须在最后。
下面是应用可变参数的更多例子:
// 完整程序存在本书配套资源目录Ch12名为VarargsTest.java
public static int sumInts(int...numbers) {  //可变整数数组类型参数
int sum = 0;
for (int num : numbers)
sum +=num;
return sum;
}      
再如:
public void totalTax(String name, double rate, double...amount) { 
                                            //普通参数在前、可变参数在后
double total = 0.0,
tax = 0.0;
for (double amount : amounts)
total += amount;
tax = total * rate;
System.out.println("Name: " + name + "\nTotal: " + total + "\ntax: " + tax);
}
Java可变参数也可应用在构造器中。例如:
public class Supper {
public Supper(char...characters) {
...
}
在子类中,可以覆盖这个构造器,如:
class SubClass extends Supper {
public SubClass(char...characters) {
...
}
}
但无法在子类中调用超类的这个构造器。
更多信息  可变参数可以用在构造器中,并可以覆盖。

Java可变参数方法重载

可以对具有可变参数的方法重载。如下例子:
void someMethod(int count, double...prices) {
//语句体
...
}
void someMethod(double...prices) {              //重载
//语句体
...
}
double someMethod(String...names) {             //重载
//语句体
...
}
...
对方法someMethod()实行重载。对具有可变参数的方法重载遵循一般方法重载原则。
如下程序应用枚举和可变参数,对在12.4.4讨论过的根据用户要求打印跑车信息的程序进一步修改,使之具有更强功能。首先,在程序中加入了如下两个用来处理跑车颜色和付款方式的枚举类型对象:
//完整程序存在本书配套资源目录Ch12名为VarargsApp.java
enum ColorType {
WHITE {String getDescription(){
return "有浅白、暗白、和亮白可选";
}
},
SILVER {String getDescription() {
return "有银白、银灰、纯银色可选";
}
},
BLACK {String getDescription() {
return "有深黑和浅黑可选";
}
};
abstract String getDescription();
}
enum PaymentType {
CASH("有10%特别优惠"),
CREDIT("接受所有信用卡"),
LOAN("贷款利息为.56%");
final private String payment;
private PaymentType(String payment) {
this. payment = payment;
}
public String getPayment() {
return payment;
}
}
另外,在SportCar中,根据用户的选择,加入了对跑车类型、颜色,以及付款方式的处理方法,并且利用可变参数。例如:
class SportCar {
SportCarType type;                      //创建
ColorType color;
PaymentType payment;
public SportCar (String...choices) {    //可变参数
type = null;                        //初始化
color = null;
payment = null;
processInfo(choices);               //调用处理信息方法
}
private void processInfo(String[] choices) {
if (choices.length == 1) {           //处理跑车类型
processType(choices[0]);
}
else if (choices.length == 2) {      //处理跑车类型和颜色
processType(choices[0]);
processColor(choices[1]);
}
else if (choices.length == 3) {      //处理跑车类型、颜色和付款方式
processType(choices[0]);
processColor(choices[1]);
processPayment(choices[2]);
}
}
private void processType(String type) {    //处理类型
if (type.equals("P"))
this.type = SportCarType.PORSCHE;
else if (type.equals("F"))
this.type = SportCarType.FERRARI;
else if(type.equals("J"))
this.type = SportCarType.JAGUAR;
}
...
这个类的驱动程序如下:
public class VarargsApp {
public static void main( String args[] ) {
SportCar yourCar = new SportCar("P");          //创建一个参数的对象
System.out.println("你要的跑车信息:\n" + yourCar + "\n");
SportCar myCar = new SportCar("J", "S");       //创建两个参数的对象
System.out.println("我要的跑车信息:\n" + myCar + "\n");
SportCar herCar = new SportCar("F", "B", "C");//创建三个参数的对象
System.out.println("她要的跑车信息:\n" + herCar + "\n");
}
}
运行结果如下:
你要的跑车信息:
制造国:德国
价格:$120,000.00
我要的跑车信息:
制造国:英国
价格:$110,000.00
有银白、银灰、纯银色可选
她要的跑车信息:
制造国: 意大利
价格:$150,000.00
有深黑和浅黑可选
有10%特别优惠

如何应用Java的可变参数相关推荐

  1. 论java中可变参数

    论java中可变参数 /*** ...可变参数* 当... 作为形参时,传入的实参是可变的* 在方法体内部,仍然可将可变参数当成数组使用* 如果传入的实参是多个单独的变量,程序会自动将多个单独的变量放 ...

  2. 灵魂拷问:Java的可变参数究竟是怎么一回事?

    这是 Java 极客技术的第 276 篇原创文章 在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常 ...

  3. 五分钟学Java:可变参数究竟是怎么一回事?

    在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常值得深入地研究一下. 我以前很不重视基础,觉得不就 ...

  4. java——慎用可变参数列表

    说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的红字明确地解释了可变参数的意思: 1 public class VarargsDemo{ 2 3 static int sum(int... ...

  5. [转载] Java之可变参数

    参考链接: Java中的可变参数(Varargs) Java可变参数 Java语言在 JDK1.5中首次推出Java可变参数 ,variable arguments,或简称varargs.这一新语言特 ...

  6. 八、Java的可变参数例子

    1.在Java中什么是可变参数 可变参数是在Java1.5中引入的特性.它准许一个方法 public static void main(String[] args) { print("a&q ...

  7. java+list可变参数_Java 可变参数

    众所周知, Java可以通过... 来给一个方法定义一个可变长度的参数. 例如 // 返回可变参数的个数 public void method(int ... i){ System.out.print ...

  8. 【Java】可变参数

    前言 C语言中,如果一个函数中可能会需要用到不同数量的参数,那么会在函数定义时使用-来省略一些参数来表示这个函数可能的参数数量是不确定的. 那么,Java在jdk1.5之后也实现了这个功能,现在来介绍 ...

  9. Java学习 --- 可变参数

    目录 一.可变参数 二.注意事项 三.相关案例 一.可变参数 Java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法,通过可变参数实现. 基本语法 访问修饰符 返回类型 方法名(数 ...

最新文章

  1. Hopfiled 神经网络实例解释
  2. Pyhon 图片透明化
  3. 启动Tomcat一闪而过解决
  4. 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库...
  5. 从 volatile 说到 i++ 的线程安全问题
  6. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车按键启动和蜂鸣器报警
  7. c 调用python_c调用python
  8. BZOJ5243 : [Lydsy2017省队十连测]绝版题
  9. java基础案例教程试题,Java基础案例教程-中国大学mooc-试题题目及答案
  10. Linux中如何删除一个大文件
  11. ❤️Mybatis编程界的能手—使用注解开发(建议收藏)
  12. 常用的Linux操作命令
  13. linux - mysql 异常:Ignoring query to other database
  14. 蚁群背包问题matlab代码,蚁群算法--背包问题
  15. UVaOJ 12304 2D Geometry 110 in 1!
  16. 计算机在英语中有哪些运用,计算机在英语教学中的运用
  17. struts2 Action中获取session,request,respon值
  18. 计算机管理服务修复,电脑提示“部署映像服务和管理工具错误87”的修复步骤...
  19. 机器人测钢卷直径_机器人热轧钢卷喷号漆
  20. 大数据篇(六) Spark Stream简介

热门文章

  1. 【数据结构与算法】之深入解析“最优运动员比拼回合”的求解思路与算法示例
  2. HarmonyOS之深入解析通知的使用
  3. 【数据结构与算法】之电话号码键盘的字母组合算法
  4. Matrix工作室第六届纳新AI组考核题(B卷)
  5. G6 图可视化引擎——入门教程——动画
  6. ASCII码八、十、十六进制对照表
  7. 数据结构和算法 —— 绪论
  8. 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解
  9. 【Linux】一步一步学Linux——sum命令(234)
  10. 程序运行依赖的重要文件版本不对_Deno核心模块:灵活依赖amp;安全沙箱