Java语法糖之个数可变的形参的实现

作者:慕课熊猫 时间:2023-12-05 00:13:20 

1. 背景

从JDK1.5开始,Java支持个数可变的形参,类似:


public class ParamDemo {
public static void main(String[] args) {
String basketball = "篮球";
String football = "足球";
showSports(basketball, football);
}

/**
* 使用个数可变形参的方法
*/
public static void showSports(String... sports) {
for (String sport : sports) {
System.out.println(sport);
}
}
}

2. 优点

其实个数可变形参的本质就是一位数组,但是如果上面的例子采用一位数组的话,写起来要更加麻烦点。


public class ParamDemo {
public static void main(String[] args) {
String basketball = "篮球";
String football = "足球";
showSports(basketball, football);
showSportsByArray(new String[] { basketball, football });
}

/**
* 使用个数可变形参的方法
*/
public static void showSports(String... sports) {
for (String sport : sports) {
System.out.println(sport);
}
}

/**
* 使用1维数组作为形参
*/
public static void showSportsByArray(String[] sports) {
for (String sport : sports) {
System.out.println(sport);
}
}
}

3. 注意事项

3.1 位置只能在方法的最后

由于个数可变的形参数量不确定,所以只能放到形参列表的最后。而数组形式的参数是可以放到形参列表任意位置的。

3.2 个数可变形参本质是数组,所以不能算重载

看下面的例子:


public class ParamDemo {
public static void main(String[] args) {
String basketball = "篮球";
String football = "足球";
showSports(basketball, football);
showSportsByArray(new String[] { basketball, football });
}

/**
* 使用个数可变形参的方法
*/
public static void showSports(String... sports) {
for (String sport : sports) {
System.out.println(sport);
}
}

/**
* 使用1维数组作为形参
*/
public static void showSports(String[] sports) {
for (String sport : sports) {
System.out.println(sport);
}
}
}

编译就报错了,如下,说明啥?String...这样的形参其实还是编译为String[]运作的,所以不算重载。


Duplicate method showSports(String[]) in type ParamDemo ParamDemo.java

示例


/**
* 可变个数形参的方法:
* javaSE 5.0 中提供了 Varargs(variable number of arguments)机制,
* 允许直接定义能和多个实参相匹配的形参,从而,可以用一种更简单的方式,
* 来传递个数可变的形参.
*
* 2.具体使用:
* 2.1 可变个数形参的格式: 数据类型...变量名
* 2.2 当调用可变个数形参的方法时,传入的参数个数可以是0个,1个,2个,。。。
* 2.3 可变个数形参的方法与本类中,形参不同的方法之间构成重载
* 2.4 可变个数形参的方法与本类中的方法名相同,形参类型也相同的数组之间不过程重载。换句话说,二者不能共存。
* 2.5 可变方法个数形参在方法的形参中,必须声明在末尾。
* 2.6 可变个数形参在方法的形参中,最多只能声明一个可变形参。
*/
//JDK 5.0之前:采用数组形参来定义方法,传入多个同一类型变量
//public static void test(int a,String[] books);
//JDK 5.0:采用可变个数形参来定义方法,传入多个同一类型变量
//public static void test(int a,String...books);
public class MethodArgsTest {
public static void main(String[] args){
MethodArgsTest test = new MethodArgsTest();
test.show(12);
test.show("hello");
test.show("hello","world","AA","BB");
// test.show(String[]{"AA","BB","CC"})
}
public void show(int i){

}
public void show(String s){
System.out.println("show(String)");
}
public void show(String...strs){
System.out.println("show(String ... strs)");
for (int i=0; i<strs.length;i++) {
System.out.println(strs[i]);
}
}
// public void show(String[] strs){

// }
//2.5
public void show(int i,String...strs){

}
}

来源:https://www.imooc.com/article/305769

标签:Java,个数可变形参
0
投稿

猜你喜欢

  • spring data jpa如何使用自定义repository实现类

    2023-05-31 07:41:17
  • SpringCloud Eureka搭建的方法步骤

    2021-10-10 11:03:29
  • MyBatis传入参数为List对象的实现

    2021-12-14 20:16:06
  • Spring Cloud Gateway 记录请求应答数据日志操作

    2021-12-27 07:25:53
  • Android搜索框通用版

    2022-12-23 09:04:46
  • Java设计模式之工厂模式

    2023-12-18 01:40:50
  • Android自定义TitleView标题开发实例

    2023-09-05 18:21:41
  • android开机自启动APP及使用adb命令测试方法

    2022-03-07 06:28:54
  • Java分布式服务框架Dubbo介绍

    2022-09-16 01:27:53
  • c# 进程之间的线程同步

    2023-07-05 06:34:23
  • Feign如何自定义注解翻译器

    2022-11-09 07:05:04
  • Java try-catch-finally异常处理机制详解

    2023-10-02 20:29:00
  • Android线程间通信Handler源码详解

    2021-12-31 07:04:10
  • android 版本检测 Android程序的版本检测与更新实现介绍

    2022-12-02 11:27:41
  • C#实现两个richtextbox控件滚动条同步滚动的简单方法

    2023-10-14 19:34:51
  • C语言实现简单的三子棋小游戏

    2022-04-26 04:17:26
  • Android游戏开发学习之引擎用法实例详解

    2023-09-26 16:01:57
  • Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理

    2023-03-30 18:16:29
  • AOP从静态代理到动态代理(Emit实现)详解

    2023-11-27 14:49:56
  • ResultSet如何动态获取列名和值

    2022-01-16 15:54:01
  • asp之家 软件编程 m.aspxhome.com