DevNotes-Java的可变参数的使用-《Java笔记》

admin 2025-10-19 02:56:30 编程 来源:ZONE.CI 全球网 0 阅读模式

Java Java 支持可变参数的形式定义方法,这种语法糖在某些时候可以简化代码。

可变参数方法的定义

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

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

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

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

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

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

在一个类中的定义相同名字的一个可变参数的方法和一个包含数组的方法,写完过后就发现 IDEA 已经提示这种写法的编译不了的了。从这里可以知道可变参数在编译为字节码后,在方法签名中会以数组形态出现的,导致这两个方法的签名一致的,如果同时出现,是不能编译通过的。

可变参数方法的调用

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

public%20static%20void%20main(String[]%20args)%20{%20%20%20%20%20%20%20%20//直接传递参数%20%20%20%20%20%20%20%20method1(1,%20"hello",%20"Fcant");%20%20%20%20%20%20%20%20//通过数组的形式传递参数%20%20%20%20%20%20%20%20String[]%20array%20=%20new%20String[]{"hello",%20"Fcant",%20"World"};%20%20%20%20%20%20%20%20method1(2,%20array);%20%20%20%20%20%20%20%20//不传递可变参数%20%20%20%20%20%20%20%20method1(3);}

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

可变参数方法的重载

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

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

第一个是只有一个可变参数形参的方法;第二个是一个%20String%20类型的固定参数和第二个参数是可变参数的方法。首先,定义的时候完全没有问题,IDEA%20也没有任何错误提示,编译也不会有问题。那么在使用的时候呢?比如下面这样的写法会输出什么结果呢?

public%20static%20void%20main(String[]%20args)%20{%20%20%20%20%20%20%20%20method2("Hello",%20"Fcant");}

在看输出结果之前,可以看到,main%20函数中的调用,其实这两个重载的函数都是可以满足的,而且编译也没有错,那么程序运行会输出什么呢?通过实际的运行结果可以看到,输出的结果是22222%20表示运行的是method2(String%20value1,%20String%20value2)%20这个方法,那说明什么问题呢?说明当存在与可变参数方法形成重载方法的时候的,会优先固定参数的方法进行执行。那如果第二个方法中的%20value2%20也是可变参数呢?那这种情况会怎么样呢?为此再看一下,下面的这种形式会怎样。

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

首先定义的时候%20IDEA%20没有任何错误提示,说明编译是没有问题的,那调用的时候呢?可以看到这个时候 IDEA 已经提示匹配到多个方法合适的方法,不能编译通过,主要是第一个和第三个方式的写法导致的,匹配到了多个可变参数的方法,日常开发的时候要注意这个问题。

Object 可变参数

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

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

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

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  11