Java 的可变参数方法详述

 更新时间:2022年02月22日 09:56:51   作者:码农小宋  
这篇文章主要介绍了Java 的可变参数方法,可变参数只能作为函数的最后一个参数,在其前面可以有也可以没有任何其他参数,由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数,下面我们一起进入文章了解更多关于可变参数的内容吧

一、可变参数方法的定义

首先看下可变参数方法在代码上是如何定义的,如下所示:

public static void method1(Integer id, String... names) {    
  System.out.println("id:" + id + " names:" + names.length);
}

通过上面的示例,我们可以看出在定义方法时,在最后一个形参类型后加上三点 …,就表示该形参可以接受多个相同类型的参数值,多个参数值被当成数组传入。

这里我们需要注意几个点:

  • 可变参数只能作为函数的最后一个参数,在其前面可以有也可以没有任何其他参数;
  • 由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数;
  • Java 的可变参数,会被编译器转型为一个数组;

上面提到可变参数的形式会被编译成一个数组,那么问题来了,我可不可以写两个下面这样的方法呢?

public static void method1(Integer id, String... names) { 
  System.out.println("id:" + id + " names:"+ names.length);
}
public static void method1(Integer id, String[] names) { 
  System.out.println("id:" + id + " names:" + names.length);
}

在一个类中的定义相同名字的一个可变参数的方法和一个包含数组的方法,写完过后我们就发现 IDEA 已经提示我们这种写法的编译不了的了。

从这里我们可以知道可变参数在编译为字节码后,在方法签名中会以数组形态出现的,导致这两个方法的签名一致的,如果同时出现,是不能编译通过的。

二、可变参数方法的调用

可变参数方法的调用跟其他方法的调用没什么区别,这里要说明的是,我们除了通过可变参数进行调用之外,还可以通过传入数组的形式来进行调用,如下所示:

public static void main(String[] args) {       
  //直接传递参数       
  method1(1, "ziyou", "java极客技术");     
  //通过数组的形式传递参数       
  String[] array = new String[]{"ziyou", "Java 极客技术", "fdf"}; 
  method1(2, array);      
  //不传递可变参数       
  method1(3);
}

通过可变参数和数组的形式,这两种调用形式本质上是一样的;另外可变参数的个数也可以为 0。

三、可变参数方法的重载

试想一下如果我们定义了下面这样的两个方法,定义和使用的时候会是什么情况

public static void method2(String... names) {   
  System.out.println("111111");
}
public static void method2(String value1, String value2) {
  System.out.println("22222"); 
}

第一个是只有一个可变参数形参的方法;第二个是一个 String 类型的固定参数和第二个参数是可变参数的方法。首先,定义的时候完全没有问题,IDEA 也没有任何错误提示,编译也不会有问题。

那么在使用的时候呢?比如下面这样的写法会输出什么结果呢?

public static void main(String[] args) {        
  method2("java 极客技术", "ziyou");
}

在看输出结果之前,我们可以看到,main 函数中的调用,其实这两个重载的函数都是可以满足的,而且编译也没有错,那么程序运行会输出什么呢?

通过实际的运行结果我们可以看到,输出的结果是​​22222​​ 表示运行的是​​method2(String value1, String value2)​​ 这个方法,那说明什么问题呢?

说明当存在与可变参数方法形成重载方法的时候的,会优先固定参数的方法进行执行,相信这一点大家应该都从来没有关注过。

写到这里可能有小明要问了,那如果我们第二个方法中的 value2 也是可变参数呢?那这种情况会怎么样呢?为此我们再看一下,下面的这种形式会怎样。

public static void method2(String... names) {      
        System.out.println("111111"); 
    }
    public static void method2(String value1, String value2) {   
        System.out.println("22222");   
    }
    public static void method2(String value1, String... value2) { 
        System.out.println("33333");    
    }

首先定义的时候 IDEA 没有任何错误提示,说明编译是没有问题的,那调用的时候呢?

可以看到这个时候 IDEA 已经提示我们匹配到多个方法合适的方法,不能编译通过,主要是第一个和第三个方式的写法导致的,匹配到了多个可变参数的方法,我们日常开发的时候要注意这个问题。

四、Object 可变参数

看到这样有小明就要问了,那我可不可以创建一个基于 Object 的可变参数方法,这样子这个方法不就是可以接受所有类型的参数了吗?就像这样:

public static void method3(Object... objects) {
        System.out.println("objects size" + objects.length);
}

首先要说的是,这么定义当然是没有问题的,但是可读性会差很多,调用方完全不知道要传入什么类型;要是真的写了太多像这样的代码,估计维护起来也是害人害己

到此这篇关于Java 的可变参数方法详述的文章就介绍到这了,更多相关Java 的可变参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现添加条码或二维码到Word文档

    Java实现添加条码或二维码到Word文档

    这篇文章主要介绍了如何在Word文档中添加条码、二维码。可在文档正文段落中添加,也可在页眉页脚中添加,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-05-05
  • Spring Security实现统一登录与权限控制的示例代码

    Spring Security实现统一登录与权限控制的示例代码

    这篇文章主要介绍了Spring Security实现统一登录与权限控制,本文通过示例代码重点看一下统一认证中心和业务网关的建设,需要的朋友可以参考下
    2022-03-03
  • 理解Java当中的回调机制(翻译)

    理解Java当中的回调机制(翻译)

    今天我要和大家分享一些东西,举例来说这个在JavaScript中用的很多。我要讲讲回调(callbacks)。你知道什么时候用,怎么用这个吗?你真的理解了它在java环境中的用法了吗?当我也问我自己这些问题,这也是我开始研究这些的原因
    2014-10-10
  • Java中Static关键字的五种用法详解

    Java中Static关键字的五种用法详解

    这篇文章主要介绍了Java中static的五种用法:修饰成员变量,修饰成员方法,修饰内部类,静态代码块,静态导包,想详细了解的小伙伴可以参考阅读本文
    2023-03-03
  • 用java代码帮朋友P图

    用java代码帮朋友P图

    这篇文章主要为大家介绍了使用java代码帮朋友P图的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 详解Spring Cloud Finchley版中Consul多实例注册的问题处理

    详解Spring Cloud Finchley版中Consul多实例注册的问题处理

    这篇文章主要介绍了详解Spring Cloud Finchley版中Consul多实例注册的问题处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 聊聊@RequestBody和Json之间的关系

    聊聊@RequestBody和Json之间的关系

    这篇文章主要介绍了@RequestBody和Json之间的关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java 设计模式原则之迪米特法则详解

    Java 设计模式原则之迪米特法则详解

    这篇文章主要介绍了Java 设计模式原则之迪米特法则详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • java String.split 无法使用小数点分割的问题

    java String.split 无法使用小数点分割的问题

    这篇文章主要介绍了java String.split 无法使用小数点分割的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 教你快速学会JPA中所有findBy语法规则

    教你快速学会JPA中所有findBy语法规则

    这篇文章主要介绍了教你快速学会JPA中所有findBy语法规则,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论