一、可变参数简介

在不确定参数的个数时,可以使用可变的参数列表。

1. 语法:

参数类型...(三个点)

例如: void printArray(Object...)

注意: 每个方法最多只有一个可变参数,因为:可变参数必须是方法的最后一个参数

2. 可变参数的类型

可变参数可以设置为任意类型:引用类型,基本类型;当然也会进行类型检查的;

3. 参数的个数:

  • 0个参数
  • 1个参数: 如果是数组,那么就直接将这个数组作为参数传进方法里面,不再填充新的数组;
  • 多个参数: 参数可以是数组,也可以是单个变量、常量;但是这时候会,将这些参数填充进新的数组里面,再将这个数组,传进方法里面;

4. 可变参数的使用

  可变参数完全可以当作一个数组来使用,或者说,本质上可变参数就是一个数组(下面详细介绍)。所以,数组拥有的方法、属性,可变参数一样拥有。

public void varArgMethod(int b,int... arr) {
//和数组一样,拥有属性length
int lenth = arr.length;
//索引遍历
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
//forEach循环遍历
for(int ele:arr) {
System.out.println(ele);
}
}

  上面的例子中,可变参数的使用跟数组的使用是完全一样,也就是说,可变参数是可以等价成数组的

5. 可变参数的方法重载

可变参数列表的方法的重载不同于普通方法: 无法仅通过改变 可变参数的类型,来重载方法。

如:varArray(int... a)varArray(Object... a),这两个方法在调用时会出错,方法重载失败。

二、 深入分析可变参数的原理

  前面已经很详细地介绍了可变参数的各个方面。这一小节将深入去了解可变参数的实现原理,特别是为什么可变参数的使用与数组是一样的。

看下面一个简单的例子:

public class MyTest{

public static void main(String[] args) {
int a = 100;
varArgMethod(5, 7,8,9,10,a);
} public static void varArgMethod(int b,int... arr) {
//索引遍历
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]);
}
} }

例子很简单,为了了解编译器是怎么处理的,我们用jad对上面例子的class文件进行反编译:

public class MyTest {

	public static void main(String args[]) {
int a = 100;
varArgMethod(5, new int[]{7, 8, 9, 10, a});//参数列表被编译器处理成了一个int[]数组
} public static transient void varArgMethod(int b, int arr[]) { //形参被编译器处理成数组
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]); }
}

  从反编译的结果可以看出,编译器不仅将可变参数处理成数组varArgMethod(int b, int arr[]),还处理了调用可变参数方法处的参数列表,把参数列表封装进一个数组varArgMethod(5, new int[]{7, 8, 9, 10, a})

  现在看来,可变参数列表并没有多神奇,只不过是将程序员做的工作简化了,交给了编译器来处理。最后,可变参数的使用和数组一样也就不出奇了,因为可变参数最后还是被编译器处理成了数组,可变参数就是数组。

java基础(九) 可变参数列表介绍的更多相关文章

  1. JAVA基础_可变参数

    自JAVA1.5以来,在JAVA中出现了可变参数一说,其针对的情况是对多个不确定的相同类型的元素进行同一类操作的情形. 可变参数有点类似与重载的概念,但是其中的可变参数是被隐式的转换成数组来进行处理的 ...

  2. 【Java基础】可变参数

    下面是一个简单的小程序: import java.util.Arrays; class lesson6 { public static void main(String[] args) { ,,,,, ...

  3. java基础40 可变参数、自动装箱和自动拆箱

    一.可变参数 可变参数是jdk1.5新特性 1.1.可变参数的格式 数据类型...变量名 // 数据类型...变量名public static void sum(int...arr){ } 1.2.可 ...

  4. JAVA基础补漏--可变参数

    使用场景:当参数列表数据类型已确定,但参数的个数不确定,就可以用可变参数 格式: 修饰符 返回值类型 方法名(数据类型...变量名){} 原理:可变参数底层为一数组,可根据变量个数的不同,创建不同长度 ...

  5. Java 可变参数列表

    1.可变参数列表的简单实现 当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表.在以前的Java代码中,可以使用Object数组来实现这样的功能.因为,所有的类都是直接或间接继承于Objec ...

  6. 可变参数列表-Java SE5新特性(转)

    Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持 ...

  7. java基础基础总结----- 构造方法,可变参数列表

    package com.mon11.day2; /** * 类说明 :构造方法,可变参数列表 * @author 作者 : chenyanlong * @version 创建时间:2017年11月2日 ...

  8. “全栈2019”Java第三十四章:可变参数列表

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. PHP函数可变参数列表的具体实现方法介绍

    PHP函数可变参数列表可以通过_get_args().func_num_args().func_get_arg()这三个函数来实现.我们下面就对此做了详细的介绍. AD:2014WOT全球软件技术峰会 ...

随机推荐

  1. Java之IO(二)BufferedInputStream和BufferedOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6971234.html 1.前言 本文主要介绍输入输出流中的BufferedInputStream和Buffere ...

  2. Android版本分布——2017年5月更新

    Code Name Version API Level Last month This month Change gingerbread(姜饼) 2.3.3——2.3.7 10 0.9% 1.0% 0 ...

  3. Java虚拟机(六):JVM调优工具

    工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...

  4. 基于Spring Task的定时任务调度器实现

    在很多时候,我们会需要执行一些定时任务 ,Spring团队提供了Spring Task模块对定时任务的调度提供了支持,基于注解式的任务使用也非常方便. 只要跟需要定时执行的方法加上类似 @Schedu ...

  5. SpringBoot入门 (三) 日志配置

    上一篇博文记录了再springboot项目中读取属性文件中配置的属性,本文学习在springboot项目中记录日志. 日志记录在项目中是很常见的一个功能了,对排查问题有很大帮助,也可以做分类分析及统计 ...

  6. BI实战派:医疗BI项目落地方案

    任何BI项目面临的两大难题是项目价值和基础数据,BI项目应该给企业带来管理优化.业绩增长.医院面临的两大难题,一:绩效管理(奖金分配):二:医患关系:在医院开始自负盈亏时日常基本运营管理显得非常重要. ...

  7. springMVC对于Controller返回值的可选类型

    2018-01-11 对于springMVC处理方法支持支持一系列的返回方式:  (1)ModelAndView (2)Model (3)ModelMap (4)Map (5)View (6)Stri ...

  8. oracle = : := 和变量绑定 oracle通配符和运算符

    这篇是7788凑的:":="是赋值语句 如: l_name :='sky';..."=" 是判断是否相等. 如: if 1=1 then...":&q ...

  9. MVC页面缓存

    1.OutputCache 属性 contact.cshtml    [OutputCache(Duration=10)] public ActionResult Contact()   {      ...

  10. Css3盒子尺寸

    box-sizing属性 用来改变盒模式中的宽度和高度默认的计算方式. box-sizing: 1.content-box(默认值): 宽度和高度只包含内容区域 2.border-box: 宽度和高度 ...