`

如何应用Java的可变参数

阅读更多

12.7 可变参数
Java语言在JDK1.5中首次推出可变参数,variable arguments,或简称varargs。这一新语言特征给软件开发人员在编写方法重载时提供了方便和灵活性。但可变参数的应用并不像想象的那么简单,使用时有其特殊要求和局限性。
12.7.1 重载的最好例子
读者朋友可能有这样的编程经历:在编写一个方法时,其参数随着程序运行的条件而变化,在编译期间无法确定。具体地讲,例如编写一个打印参加聚会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 张新
12.7.2 怎样工作
可变参数也不神秘。实际上,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);
}

可变参数也可应用在构造器中。例如:

public class Supper {
public Supper(char...characters) {
...
}

在子类中,可以覆盖这个构造器,如:

class SubClass extends Supper {
public SubClass(char...characters) {
...
}
}

但无法在子类中调用超类的这个构造器。
更多信息 可变参数可以用在构造器中,并可以覆盖。
12.7.3 可变参数方法重载
可以对具有可变参数的方法重载。如下例子:

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%特别优惠

分享到:
评论
1 楼 xiaoqing20 2010-01-02  
不错

相关推荐

    java可变参数

    Java可变参数是Java语言中一个非常实用的特性,它允许方法接受数量可变的参数。这个特性在Java 5中被引入,极大地提高了代码的灵活性和可读性。下面我们将详细探讨Java可变参数的概念、用法以及背后的实现原理。 ##...

    Java数组传递及可变参数操作实例详解

    Java数组传递及可变参数操作实例详解 Java 数组传递是指在方法之间传递数组对象的引用,而不是传递数组对象本身。这意味着,方法中对数组的修改将会影响原数组。在 Java 中,所有对象都是通过引用进行操作的,而...

    10.java可变参数.zip

    10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可...

    Java可变参数demo

    在Java编程语言中,可变参数(Variable-Argument Parameters)是一项强大的特性,它允许函数接收一个不...通过这个小demo,开发者可以加深对Java可变参数的理解,并将其应用到实际项目中,提高代码的效率和可维护性。

    Kotlin传递可变长参数给Java可变参数实例代码

    Kotlin传递可变长参数给Java可变参数实例代码 Kotlin是一种现代化的静态类型语言,运行于Java虚拟机上,能够与Java语言进行无缝集成。在实际开发中,我们经常需要在Kotlin和Java之间进行交互,特别是在调用Java方法...

    java可变参数.pdf

    Java中的可变参数(Varargs)是一种语法特性,允许开发者定义接受不定数量参数的方法。这在实际开发中非常有用,特别是在实现方法重载或者想要简化代码时。可变参数在Java中自J2SE 1.5版本起被引入。在可变参数方法...

    [java]中的可变参数定义和使用

    本篇介绍了Java中可变参数的定义和使用方法,以及数组作为参数和返回值的应用。可变参数为方法提供了更大的灵活性,允许根据实际需要传递不同数量的参数。而数组作为参数和返回值则是另一种常见的应用场景,尤其是在...

    C以及Java中可变参数列表函数定义方法

    本文将探讨一个共同的话题——如何在C和Java中定义可变参数列表的函数。可变参数列表,也称为不定参数或可变参数,允许函数接受不同数量的参数,增加了代码的灵活性。 在C语言中,可变参数列表的实现依赖于`stdarg....

    java可变参数[文].pdf

    总之,Java可变参数简化了处理可变数量参数的方法定义和调用,使得代码更加简洁,同时也保留了数组的灵活性。在实际开发中,尤其是在需要处理命令行参数、集合数据等场景下,可变参数是一个非常实用的特性。

    Java中的可变参数常见用法实例总结

    Java中的可变参数常见用法实例总结 Java中的可变参数是一种特殊的参数类型,允许在方法中传递可变数量的参数。下面是Java中的可变参数常见用法实例总结: 一、可变参数的概念 在J2SE 1.4之前,Java中无法定义实参...

    Java的可变参数讲解代码(使用方式、原理、结合泛型、使用元组或列表进行参数传递、 使用默认值、缓存计算结果、实战构建动态日志)

    Java可变参数(Varargs)是一种语言特性,允许方法接受可变数量的参数。在方法声明中使用省略号(...) 表示,可以将不定数量的参数传递给方法。可变参数使得方法更加灵活,可以接受任意数量的参数,并以数组形式访问...

    Java中支持可变参数详解

    Java中的可变参数(Variable Argument)是Java 5引入的一项特性,它允许我们在定义方法时,接受数量可变的参数。这种机制使得方法调用更加灵活,尤其在处理不确定参数个数的情况时,大大简化了代码。下面我们将深入...

    java可变参数当做数组处理的方法示例

    Java可变参数是Java 1.5中增加的一项新特性,可以应用于参数个数不确定,类型确定的情况下。Java把可变参数当做数组处理,需要注意的是可变参数必须位于最后一项,否则将会出现编译错误。 可变参数的特点有三点: ...

    Java可变参数列表详解

    Java可变参数列表,也称为不定参数,是Java语言中的一种特性,允许方法接收数量可变的参数。这种特性在编程时提供了极大的灵活性,尤其是在处理不确定数量输入的情况下。以下是关于Java可变参数列表的详细解释。 1....

    java类和对象之可变参数.docx

    Java 类和对象是编程语言的基础,而可变参数(Variable Argument)是 Java 为了解决方法接收不定数量参数的问题引入的一个特性。这个特性允许我们创建一个方法,它能接受一个可变数量的参数,而不是固定数量。这在...

    关于java中可变长参数的定义及使用方法详解

    Java中的可变长参数(Varargs)是一种非常实用的语言特性,它允许我们在定义方法时接受一个不定数量的参数。这种特性使得我们无需为每个可能的参数组合定义单独的方法,简化了代码并提高了代码的可读性和灵活性。...

    java 可变参数详解及实例

    Java 可变参数是Java 5.0引入的一项新特性,它允许我们在方法签名中使用一个带有省略号(...)的参数,使得该方法能够接收任意数量的相同类型的参数。这种特性使得方法调用更加灵活,同时也简化了处理不定数量参数的...

    java类和对象之可变参数.pdf

    Java中的可变参数(Variable Arguments)是编程中一个便利的功能,允许我们在方法声明时定义一个可以接受任意数量相同类型参数的参数列表。这种特性在处理不确定数量输入时非常有用,比如函数式编程中的高阶函数。 ...

    JAVA可变参数之经典用法

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/1063296

    Java 实例 - Varargs 可变参数使用源代码-详细教程.zip

    下面我们将深入探讨Java可变参数的工作原理、语法以及如何在实际项目中应用。 1. 可变参数的语法: 可变参数的声明方式是在参数类型后面加上三个点(...)。例如,以下是一个简单的可变参数方法,用于计算整数之和...

Global site tag (gtag.js) - Google Analytics