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

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){

}
}

到此这篇关于Java语法糖之个数可变的形参的实现的文章就介绍到这了,更多相关Java 个数可变的形参内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java定义形式及可变参数实例解析

    这篇文章主要介绍了Java定义形式及可变参数实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java中的方法类似于面向过程程序设计中的函数,但与其不同的是,Java中的方法不能独立存在,它属于类或对象.既然方法属于类或对象,那么,方法的调用者就必须是类或对象.(当然,之后将会提到的同一个类中方法互相调用,实际上也是类或对象在作为调用者) 还是先上一段代码: package com.my.pac05; /** * @author Summ

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

    1. 背景 从JDK1.5开始,Java支持个数可变的形参,类似: public class ParamDemo { public static void main(String[] args) { String basketball = "篮球"; String football = "足球"; showSports(basketball, football); } /** * 使用个数可变形参的方法 */ public static void showSport

  • java语法糖之jdk迭代的新特性汇总

    语法糖(Syntactic sugar) 是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会. 糖1:for-each 功能和传统的fori相似 代码样例 public class Test { public static void main(String[] args) { int[] num = new in

  • JAVA语法糖原理你知道吗

    目录 Java语法糖 1.基本概念 1.1语法糖 1.2解语法糖 2.常见糖块 2.1 switch 支持 String 与枚举 2.2泛型 2.3自动装箱与拆箱 2.4方法变长参数 2.5枚举 2.6条件编译 2.7 for : each循环 3.最后 3.1Java编译与反编译 总结 Java语法糖 ​ 几乎所有的编程语言都或多或少提供过一些语法糖来方便程序员的代码开发,这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高效率,或能提升语法的严谨性,或能减少编码出错的机会. 1.基本概念

  • 不了解这12个语法糖,别说你会Java

    本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理. 语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.简而言之,语法糖让程序更加简洁,有更高的可读性. 有意思的是,在编程领域,除了语法糖,还有语法盐

  • Java 中的语法糖,真甜

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 我们在日常开发中经常会使用到诸如泛型.自动拆箱和装箱.内部类.增强 for 循环.try-with-resources 语法.lambda 表达式等,我们只觉得用的很爽,因为这些特性能够帮助我们减轻开发工作量:但我们未曾认真研究过这些特性的本质是什么,那么这篇文章,cxuan 就来为你揭开这些特性背后的真相. 语法糖 在聊之前我们需要先了解一下 语法

  • 用C#的params关键字实现方法形参个数可变示例

    个人认为,提供params关键字以实现方法形参个数可变是C#语法的一大优点.在方法形参列表中,数组类型的参数前加params关键字,通常可以在调用方法时代码更加精练. 例如,下面代码: class Program { static void Main(string[] args) { Console.WriteLine(Sum(1)); Console.WriteLine(Sum(1, 2, 3)); Console.WriteLine(Sum(1, 2, 3, 4, 5)); Console.

  • 深入理解Java基础之try-with-resource语法糖

    背景 众所周知,所有被打开的系统资源,比如流.文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故. 在Java的江湖中,存在着一种名为finally的功夫,它可以保证当你习武走火入魔之时,还可以做一些自救的操作.在远古时代,处理资源关闭的代码通常写在finally块中.然而,如果你同时打开了多个资源,那么将会出现噩梦般的场景: public class Demo { public static void main(String[] arg

  • 一起聊聊Go语言中的语法糖的使用

    目录 前言 进入正题 可变长参数 声明不定长数组 ... 操作符 切片循环 忽略变量.字段或者导包 短变量声明 另类的返回值 总结 前言 由于工作变动,我现在已经开始使用Golang了.用了一段时间之后,我发现Golang(后面简称Go)中的语法糖还蛮多的,有些语法糖还让会让人很懵逼.那么接下来,让我以一个曾经的 Java CURD boy,来说一说 Go 中的语法糖. 进入正题 至于什么是语法糖,名词解释我就不解释了,老司机自然是懂,新手司机想了解的可以去百度问一下.闲话少说我们直接开讲. 可

  • Go语言提升开发效率的语法糖技巧分享

    目录 前言 可变长参数 声明不定长数组 init函数 忽略导包 忽略字段 json序列化忽略某个字段 json序列化忽略空值字段 短变量声明 类型断言 切片循环 判断map的key是否存在 select控制结构 前言 哈喽,大家好,我是asong. 每门语言都有自己的语法糖,像java​的语法糖就有方法变长参数.拆箱与装箱.枚举.for-each​等等,Go​语言也不例外,其也有自己的语法糖,掌握这些语法糖可以助我们提高开发的效率,所以本文就来介绍一些Go语言的语法糖,总结的可能不能全,欢迎评论

  • Java语法之 Java 的多态、抽象类和接口

    目录 一.多态 1. 向上转型 2. 动态绑定 3. 方法重写 4. 向下转型 5. 关键字 super 6. 在构造方法中调用重写方法(坑) 7. 理解多态 8. 小结 二.抽象类 1. 概念 2. 注意事项 3. 抽象类的意义 3. 抽象类的作用 三.接口 1. 语法规则 2. 实现多个接口 3. 接口的继承 4. Comparable 接口 4. Comparator 接口 5. Cloneable 接口和深拷贝 上一篇文章:Java 基础语法之解析 Java 的包和继承 今天这章主要介绍

随机推荐