我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java的可变参数方法详述

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 的可变参数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java的可变参数方法详述

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中的可变参数使用方法

java中的可变参数使用方法可变参数时Java 1.5新增的方法,可变参数方法接收0个或者多个指定类型的参数,可变参数机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法。如:publ
2023-05-31

Java的可变参数方法怎么用

今天小编给大家分享一下Java的可变参数方法怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、可变参数方法的定义首先看
2023-06-29

AJPFX可变参数的概述和使用

这篇文章主要讲解了“AJPFX可变参数的概述和使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“AJPFX可变参数的概述和使用”吧!A:可变参数概述定义方法的时候不知道该定义多少个参数B:格
2023-06-02

Java中可变长度参数代码详解

到J2SE1.4为止,一直无法在Java程序里定义实参个数可变的方法——因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了。尽管可以通过重载机制,为
2023-05-30

C++ 函数的默认参数和可变参数详解

c++++ 默认参数允许为函数参数设置默认值,而在可变参数中,可以为函数提供任意数量的参数。具体而言:默认参数:允许在函数声明时为参数指定默认值,在调用时如果没有提供值则使用默认值。可变参数:使用 ... 表示,允许函数接受任意数量的参数,
C++ 函数的默认参数和可变参数详解
2024-04-19

C/C++中可变参数的用法详细解析

可变参数的使用方法远远不止以下介绍的几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
2022-11-15

java可变参数的作用有哪些

这篇文章将为大家详细讲解有关java可变参数的作用有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。java可变参数的作用:在编写方法的过程中,可能会遇见一个方法有不确定参数个数的情况。一般我们会用方法
2023-06-14

Python中可变参数的使用方法和特点

Python中可变参数的特性及使用技巧Python是一种简洁而强大的编程语言,其提供了许多灵活的特性来简化开发过程。其中之一就是可变参数(variable arguments),它允许我们在函数定义时不确定参数的个数。本文将介绍可变参数的
Python中可变参数的使用方法和特点
2024-02-02

PHP函数可变参数列表的具体实现方法

这篇文章将为大家详细讲解有关PHP函数可变参数列表的具体实现方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。也许对于PHP初级程序员来说,对于PHP函数并不能完全熟练的掌握。我们今天为大家
2023-06-17

PHP 函数的参数传递方式在可变参数中的运用?

php 可变参数函数允许您传递任意数量的参数,这些参数按值传递并包含在一个数组中。使用三个点 (...) 表示可变参数,紧跟在最后一个普通参数后面。可变参数提供灵活性,允许您创建通用的数据处理函数、数组合并函数和处理任意数量查询参数的数据库
PHP 函数的参数传递方式在可变参数中的运用?
2024-04-15

C++ 函数参数传递方式与可变参数函数的关系

函数参数传递方式包括值传递、引用传递和指针传递,其中可变参数函数只能以指针传递方式传入参数,因为函数需要知道可变参数部分的地址。例如,sum() 函数使用 ... 接受数量未知的参数,然后使用 va_arg() 宏获取可变参数的值。C++
C++ 函数参数传递方式与可变参数函数的关系
2024-04-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录