java 参数 可变_Java可变参数

在jdk5之前,可能我们要通过这样的方式来实现可变参数的方法:

packagewww.com.thinkInJava.initializationCleanup;public classVarArgs {static voidprintArray(Object[] args) {for(Object obj : args) {

System.out.print(obj+ " ");

}

System.out.println();

}public static voidmain(String[] args) {

printArray(new Object[]{new Integer(23), 23.2f, "sdfdsf", new Double(23.234), newA()});

}

}class A{}

通过Object[]数组来实现。

输出如下:

1df1e1325376cddb5896b251e1041a38.png

但在jdk5之后,Java终于有可变参数这个特征了。

语法类似于static void printArray(Object... args)

packagewww.com.thinkInJava.initializationCleanup;public classVarArgs {static voidprintArray(Object...args) {for(Object obj : args) {

System.out.print(obj+ " ");

}

System.out.println();

}public static voidmain(String[] args) {

printArray(new Integer(32), 23.f, "sfsdf", new String("helosdfakl"), 234, newA());

printArray((Object[])new Integer[]{12, 23, 345, 456, new Integer(666)});

printArray();

}

}class A{}

输出如下:

7dc6f668431f19189d7a79db1d059f26.png

main函数里的第一句调用可见,这个可变参数的原理应该类似于我们之前的Object[]的方法,因为我们传进去的是普通的不同的参数,而却可以用array的foreach来遍历元素,说明应该是自动将一系列元素转换成了数组;

main函数的第二句调用可见,还可以直接传一个数组Object的array进去。(这里我们将Integer引用的数组转换成了Object的,同时数组的定义里面也用了autoboxing,即把普通的int自动转换成对应的Integer对象。)

main函数的第三句调用可见,对于可变参数的方法,可以什么都不传过去。

下面一个例子证明了,可变参数确实是把参数转换成了数组的形式:

packagewww.com.thinkInJava.initializationCleanup;public classVarargType {static voidf(Character... args) {

System.out.print(args.getClass());

System.out.println(" length " +args.length);

}static void g(int... args) {

System.out.print(args.getClass());

System.out.println(" length " +args.length);

}public static voidmain(String[] args) {

f('a');

f();

g(1);

g();

System.out.println("int[]: " + new int[0].getClass());

}

}

输出:

778b024337cd6ef6be46ac943f29f1b5.png

这里,class的描述,有个“[”开头,表明这个class是个数组,然后中括号后面紧跟着的就是这个数组的数据类型,像这里紧跟着的I表明这是个基本数据类型int的数组。

main函数里面最后的一行代码证明了这个过程,直接输出了一个int数组的getClass,输出和上面的一样,证明可变参数确实是把元素转换成数组。

方法的重载overload也是可以用可变参数的,但可能会使方法变得很复杂,建议小心使用,这里也给个例子:

packagewww.com.thinkInJava.initializationCleanup;public classOverloadingVarargs {static voidf(Character... args) {

System.out.print("first");for(Character c : args)

System.out.print(" " +c);

System.out.println();

}static voidf(Integer... args) {

System.out.print("second");for(Integer i : args)

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

System.out.println();

}static voidf(Long... args) {

System.out.println("third");

}public static voidmain(String[] args) {

f('a', 'b', 'c');

f(1);

f(2, 1);

f(0);

f(0L);//! f();//Won’t compile -- ambiguous

}

}

输出结果:

f2a2178f55c055274fe069a22d3ea3cb.png

这里看到,不能调用没有参数的f()了,因为编译器无法辨别是哪个方法。这个无参数的方法调用连编译都无法通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值