可变参数

2023-11-04

可变参数语法格式

前言:函数是指定义在类中的一段可以独立运行的小程序,如方法,构造器等。
1.java可变参数是指在调用方法时传入不定长度的参数,本质上是基于数组实现的。

    //参数为可变参数
    public static void element(Integer... args){ }
    //参数为数组
    public static void element(Integer[] args){ }

2.在定义方法时,在最后一个形参上加"…"就表示该形参可以接受多个参数值,多个参数值被当做数组传入。

import java.util.Scanner;

/**
 * @version 1.0
 * @Author mmrone gsx
 * @Date 2023/1/9 16:16
 * @注释
 */
public class Demo {
    void tese(Integer... number){
        for (int num:number) {
            System.out.print(num+" ");
        }
        System.out.println("");
    }
    public static void main(String[] args){
    //可变参数
        Demo demo =new Demo();
        demo.tese();
        demo.tese(1);
        demo.tese(1,2);
        demo.tese(1,2,3);
    }
}

3.可变参数只能做为函数的最后一个参数,前面有没有其他参数都可以,一个函数最多只能有一个可变参数。

	//只有可变参数
	public static void element(Integer... args){ }
	//有其他参数
	public static void element_two(int age,int... args){ }

4.可变参数在编译为字节码后,在方法签名中是以数组形态出现的,如果两个方法签名编译后的是一致的话,是不能编译通过的,不可以作为方法的重载。下述二种方法只能留其一

    //参数为可变参数
    public static void element(Integer... args){ }
    //参数为数组
    public static void element(Integer[] args){ }

5.可变参数作为参数的方法可以传入数组类型的数据或者直接传入多个数据,但是数组作为参数的方法只能传入数组类型的数据。

public class Demo2 {

	//可变参数作为参数的方法
    public static void element(int... args) {
        for (int arg : args) {
            System.out.println(arg);
        }
    }
    
     public static void main(String[] args) {
      //都可以
      element(1,2,3);
      int[] array={1,2,3};
      element(array);
   }

}


public class Demo2 {

	//数组作为参数的方法
    public static void element(int[] args) {
        for (int arg : args) {
            System.out.println(arg);
        }
    }
    
     public static void main(String[] args) {
     //不可以,编译错误
      element(1,2,3);
      //可以
      int[] array={1,2,3};
      element(array);
   }

}

6.方法重载

1)调用一个被重载的方法时,如果此调用既能够和固定长度的重载方法匹配,又能和可变参数的重载方法匹配的话,会优先选择固定参数的重载方法。

public class Demo2 {
    
    public static void element(int... args){
        for (int arg : args) {
            System.out.println(arg);
        }
    }
    
    public static void element(int age,int money){
        System.out.println(age+"    "+money);
    }
    
    public static void main(String[] args) {
    	//会优先选择固定参数的方法
        element(1,2);
    }
    
}

2)当调用一个被重载的方法时,如果此调用能够和两个有可变参数的重载方法匹配,会出现编译错误。

public class Demo2 {

    public static void element(int... args) {
        for (int arg : args) {
            System.out.println(arg);
        }
    }

    public static void element(int age, int... args) {
        System.out.println(age);
        for (int arg : args) {
            System.out.println(arg);
        }
    }

    public static void main(String[] args) {
    	//会出现编译错误,不可以运行
        element(1, 2);
    }

}

3)避免使用空值和null,当两个方法的方法名和其他参数都相同,只有可变参数不同的时候,传入空值或者null会产生编译错误。

public class Demo2 {

    public static void element(int age, int... args) {
        System.out.println(age);
        for (int arg : args) {
            System.out.println(arg);
        }
    }

    public static void element(int age, String... args) {
        System.out.println(age);
        for (String arg : args) {
            System.out.println(arg);
        }
    }

    public static void main(String[] args) {
    	//传入空值或者null,无法区分调用哪一个方法,会编译错误
        element(1);
        element(1,null);
    }

}

修改方法:让编译器知道传入的null是什么类型的,好让他找到对应的方法。

public static void main(String[] args) {
        int[] array=null;
        element(1,array);
    }

7.方法覆写
有一种十分特殊的情况,父类方法用的是可变参数,而子类覆写使用的是数组,虽然覆写的方法参数和父类不一样,但是可以编译通过,不过不建议采用。

import java.util.Scanner;

/**
 * @version 1.0
 * @Author mmrone gsx
 * @Date 2023/1/9 16:16
 * @注释
 */
public class Demo {

    public static void main(String[] args) {
        //可以编译成功,编译看左边,运行看右边
        Father father=new Sun();
        father.element(1);
        //不可以编译通过,编译看左边,参数
        Sun sun = new Sun();
        int[] array = new int[]{1,2};
        sun.element(array);
    }

    //父类
    public static class Father {
        public  void element(int... args) {
            System.out.println("可变参数");
        }
    }

    //子类
    public static class Sun extends Father {
        public  void element(int[] args) {
            System.out.println("数组");
        }
    }

}


方法覆写必须满足以下条件:
1)覆写方法不能缩小访问权限。
2)参数列表必须和被覆写方法保持一致(包括表现形式)。
3)返回类型必须与被覆写方法相同或者是其子类。
4)覆写方法不能抛出新的异常,或者超出父类范围的异常,但是可以不抛出或者抛出范围更小的异常。
8.使用Object…作为可变参数会出现多种情况。

public class Demo4 {

    public static void element(Object... args){
        System.out.println(args.length);
    }

    public static void main(String[] args) {
        //Integer[]可以转型为Object[],可以作为一个对象数组
        element(new Integer[]{1,2,3});
        //多个参数的话,Integer[]会被当做一个单纯的数组对象
        element(1,new Integer[]{2,3});
        element(1,2,3);
        //int[] 无法转型为Object[],因此会被当做一个单纯的数组对象
        element(new int[]{1,2,3});
    }

}

9.反射时,可变参数的注意事项。

public class Demo5 {

    public static void element(Integer... args){
        System.out.println(args.length);
    }

    public static void main(String[] args) {
        Integer[] arrry={1,2,3};
        try {
            //反射是运行时获取的,在运行时看来,可变参数和数组上是一致的。因而方法的签名为([java/lang/Integer;)V
            //Method对象的方法声明为Object invoke (Object obj,Object.. args)
            //args虽然是一个可变长度的参数,但是args的长度受限于该方法对象代表的真实方法的参数列表长度,从运行时签名来看,([java/lang/Integer;)V实际上是一个形参,即Integer[] args,因此invoke (Object obj,Object.. args)中可变参数args的实际参数长度只能为1。
            Method method = Demo5.class.getMethod("element", Integer[].class);
            //array的长度为3,不符合
            method.invoke(null,arrry);
            //将Integer[]转为Object[],长度还是为3,不符合
            method.invoke(null,(Object[])arrry);
            //将整个Integer[]转为一个Object,长度为1,符合
            method.invoke(null,(Object)arrry);
            //Object[]的长度为1,符合,和上面相同
            method.invoke(null,new Object[]{arrry});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可变参数 的相关文章

  • eclipse mylyn 与 redmine

    是否可以将mylyn连接到redmine而不需要redmine中的rest支持 有一个链接http download eclipse org mylyn incubator 3 8 http download eclipse org myl
  • 如何使用 Windows 上运行的 Java 服务检测用户活动?

    我的目标是使用 Java 创建一个系统监控应用程序 我想知道用户何时在 Windows PC 上进行活动 结果会是这样的 8 00 8 15 活动 9 12 10 29 活动 12 24 15 34 活动 我对任何其他信息 按下了哪个键 使
  • 多线程以原子方式对大量值求和

    我正在开发一个应用程序 其中有大量线程 并且必须自动添加 100 个值 我在用AtomicLong效果很好 但仍需要提高性能 有没有比 AtomicLong 提供更好性能的东西 您可以使用长加法器 https docs oracle com
  • 有没有办法获取 JList 中的所有元素?

    我想知道是否有一种方法可以检索已添加到 JList 的所有元素的列表 例如 我希望 JList 从自定义单元格渲染器返回字符串或 JLabels 的数组或列表 您可以使用getModel http docs oracle com javas
  • 为什么在Java中读取易失性和写入字段成员是不可扩展的?

    观察以下用 Java 编写的程序 完整的可运行版本如下 但程序的重要部分在下面的代码片段中 import java util ArrayList A not easy to explain benchmark class MultiVola
  • 在记录活动中使用 readConfiguration 方法

    为了在小型 Java 桌面应用程序中使用日志记录 我试图深入了解一些方法的操作 我使用一个非常愚蠢的小Java程序来测试它们 特别是 在测试 LogManager readConfiguration 方法的行为时 我发现了一些奇怪的事情 在
  • RSA Java 加密和 Node.js 解密不起作用

    我有一个系统 需要在 javascript 中生成 RSA 密钥对 然后将公钥存储在服务器端的数据库中 作为字符串 然后 Java 中的服务器端将使用存储的公钥对字符串进行加密密钥并将其发送到客户端 客户端将使用私钥解密该字符串 我在客户端
  • 为什么这个 Java 静态字段为空?

    public class StaticTest private static String a private static String b this is a public static void main String args a
  • 问题:将大数据传递给第二个 Activity

    我有一个奇怪的问题 我在网上浏览但没有找到答案 我仍然是android编程的初学者 那么让我们开始吧 我想做的就是用一些数据调用第二个活动 它适用于小数据 但如果数据变大 第二个 Activity 将不会显示 第一个 Activity 将完
  • JFreeChart 更改现有条形图中的数据

    我想循环更改条形图数据 但我不知道该怎么做 我的代码 DefaultCategoryDataset barChartData new DefaultCategoryDataset barChartData setValue 0 Values
  • Spring Data JPA 规范继承

    我有三个实体 如下所示 Entity Inheritance strategy InheritanceType JOINED DiscriminatorColumn name type public abstract class Emplo
  • 使用 Hashmap 理解两个或多个键

    我的哈希图有问题 在我的哈希映射方法中 我希望有两个或多个关键字作为键 而不是只有一个 例如 我希望用户输入一些包含两个或多个关键字的句子 假设 教授姓名 是关键字 例如 String temp3 instructor teacher me
  • 面临 process.start(); 的问题在 Android 棒棒糖中

    面临一个问题process start 在 Android 棒棒糖中 我在服务中遇到了 android lollipop 后台进程的问题 我的代码在 KitKat 之前工作正常 我有一个ProcessBuilder pBuilder并向其中
  • Java 多态性中的字段如何工作? [复制]

    这个问题在这里已经有答案了 我正在读书面试问题 http javabypatel blogspot in 2016 04 java interview questions html关于java 发现了很好的例子 但感到困惑 因为没有很好 更
  • 菜单项标题未显示

    菜单项的标题未显示在片段内 我在菜单文件中有两个项目 第一个是带有图标和标签的showAsAction always在工具栏中显示图标 第二个只有标题 我不知道这里出了什么问题 菜单项的所有操作均有效 例如下面 菜单 销售 xml menu
  • 如何更新 Websphere 7 以使用 EL2.2?

    这就是我所做的 按照此林肯 巴克斯特的帖子 http ocpsoft com java jsf2 java jsf2 how to add the magic of el el2 to jsf 我下载了 el api 2 2 jar 和 e
  • Selenium - WebDriver.findElement() 和 WebElement.findElement() 之间的区别

    我正在使用WebElement findElement By cssSelector click 在页面上查找某个元素 但它返回了 Unable to locate element 但是当我使用WebDriver findElement B
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • 在 Ubuntu 上的 Tomcat 中加载共享本机库

    如何在 Ubuntu 上的 Tomcat6 中加载共享库 我创建了一个名为 libawragrids so 的库 awragrids 并将其放置在 var lib tomcat6 shared 我在调用启动 tomcat 的终端中设置了以下
  • 解决SecurityException:权限拒绝:启动意图。我需要什么许可?

    我想从应用程序打开游戏商店 在三星手机上还好 但在一加手机上却失败了 我不知道在哪里alibaba来自 真奇怪 异常 java lang SecurityException 权限拒绝 启动意图 act android intent acti

随机推荐

  • [设计模式] 浅谈SOLID设计原则

    目录 单一职责原则 开闭原则 里氏替换原则 接口隔离原则 依赖倒转原则 SOLID是一个缩写词 代表以下五种设计原则 单一职责原则 Single Responsibility Principle SRP 开闭原则 Open Closed P
  • VC++6.0的使用技巧

    1 建立工程 一定要创建window32位控制台应用 Win32 console Application 2 创建新文件 文件 新建 文件 源文件或头文件 3 如果不想要的文件 File View gt XXX files gt Sourc
  • 量子力学与自由意志

    第一个观点 是有造物主存在的 人不是偶然出险的 第二个观点 人是否具备自由意志 人可以违背生物定律做出自己的选择 量子力学的微观实验 因果链可以倒置 唯物主义与唯心主义到底谁是对的 熵增定律 普朗克 爱因斯坦 波尔 杨老 世界是非连续的 粒
  • [520]pandas(ix & iloc &loc)区别

    loc 通过行标签索引行数据 iloc 通过行号索引行数据 ix 通过行标签或者行号索引行数据 基于loc和iloc 的混合 举例说明 1 分别使用loc iloc ix 索引第一行的数据 coding utf 8 import panda
  • Python中heapq模块浅析

    Python提供了heapq模块 有利于我们更好的对堆的相关操作进行简化 下面总结我所用到的相关方法 文章目录 0 回顾堆的概念 1 heappush heap item 建立大 小根堆 2 heapify heap 建立大 小根堆 3 h
  • 一款运行于windows上的linux命令神器-Cmder(用过后爱不释手)

    一 前言 很多工程师都习惯了使用linux下一些命令 再去用Windows的 cmd 简直难以忍受 要在windows上运行linux命令 目前比较流行的方式由 GunWin32 Cygwin WSL Bash on Windows Git
  • 手写生产者消费者,要求指定容量,有个put方法和一个get方法,和当前库存量size

    废话不多说 直接看代码 tomcat addAdditionalTomcatConnectors httpConnector 1 核心代码 2 生产者 生产者 class ShopProducer implements Runnable p
  • journalctl 查看历史日志

    查看历史日志 使用 journalctl 命令来查看 systemd 日志时 可以使用 since 和 until 标志来查看特定时间范围内的历史日志 以下是一些示例命令 它们将显示不同时间范围内的历史日志 显示过去一小时内的日志 jour
  • Python 核心笔记(一)

    Python 是一种支持面向对象的解释性高级语言 Simple yet Powerful 是人们对它的 一致评价 最初是在苹果计算机上被编译成功的 但现在他已经可以运行于世界上主流的 操作平台之上了 跨平台性极强 它包含多种 Program
  • 小白易懂的遗传算法(Python代码实现)

    无约束的遗传算法 最简单的 最开始真正理解遗传算法 是通过这个博主的讲解 安利给小白们看一看 遗传算法的Python实现 通俗易懂 我觉得博主写的让人特别容易理解 关键是代码也不报错 然后我就照着他的代码抄了一遍 认真地理解了一下每一个模块
  • 【Springboot】整合wxjava实现 微信小程序:授权登录

    文章目录 一 wxjava是什么 二 使用步骤 1 引入依赖 2 配置yml 3 小程序的配置 4 后端的业务逻辑代码 controller service impl dto 5 前端的业务逻辑代码 新建项目 微信开发者工具 提示 以下是本
  • OpenLayers基础教程——popup弹出框

    1 前言 在OpenLayers中 一般使用ol Overlay实现popup弹出框 弹出框一般用于显示地图上兴趣点的一些属性信息 如下图所示 下面开始介绍实现方法 2 准备测试数据 在SqlServer中新建一张省会数据表 Provinc
  • Android View的Adapter

    1 Adapter适配的对象是View Adapter通过为View提供指定格式的数据来适配View 让View可以以事先约定好的方式将内容展示给用户 所以 进行UI设计的关键是搞清楚各个View组件的外观以及它们需要的数据的格式 然后选用
  • react 学习(二) 实现类和函数式组件

    我们上一节了解了 react 的虚拟 dom 的格式 如何把虚拟 dom 转为真实 dom 进行挂载 其实函数是组件和类组件也是在这个基础上包裹了一层 一个是调用函数返回虚拟 dom 一个是调用实例的 render 方法 返回虚拟 dom
  • C语言 求最大值和最小值

    author 爱太阳的麦芽糖 IDE VS2019 qq 1192273194 TIME 16 6 2019 PS 如果您有什么问题可以在下方留言哦 步骤 代码分三个部分阅读 后方有完整的代码 1 第一个for循环接受十个float类型的数
  • ngrok免费内网穿透服务搭建教程

    ngrok 内网穿透 进入ngrok官网注册 下载ngrok 计算机授权 启动服务 远程连接建立成功 测试 ngrok的一些细节 进入ngrok官网注册 https ngrok com 首先需要注册一个账号 注册账号时可能会刷新不出验证码
  • 回归标准差和残差平方和的关系_最新

    来源 由计量经济学服务中心综合整理自计量经济学等 转载请注明来源 1 回归分析统计量 根据矩阵的概念 标准的回归可以写为 一 系数结果 1 回归系数 最小二乘估计的系数b是由以下的公式计算得到的 2 标准差标准差项列出了系数估计的标准差 估
  • app服务器上的文件组成,聊天App—服务端的准备(SSH的学习)

    经过十一周两场考试和电子实训后 学习也进入了新的阶段 突发奇想想尝试做一个简易的聊天app项目 以后在朋友间使用也是一件挺有趣的事情 首先先从服务端的搭建开始 服务端最主要的就是进行数据的处理和数据库的连接 我目前学习的有了jdbc连接数据
  • remote: HTTP Basic:Access denied fatal:Authentication failed for

    近来在一天新电脑上面使用git pull 一个项目 老是提示 Access denied 找了许多方法 ssh key这些都配置了还是不行 当时别提有多尬 看嘛这就是pull 时的提示 此处省略 多种测试方法 就不一一啰嗦了 直接进入主题
  • 可变参数

    可变参数 可变参数语法格式 可变参数语法格式 前言 函数是指定义在类中的一段可以独立运行的小程序 如方法 构造器等 1 java可变参数是指在调用方法时传入不定长度的参数 本质上是基于数组实现的 参数为可变参数 public static