zoukankan      html  css  js  c++  java
  • 【java笔记】可变长参数(...)

    ===============================================

     2021/4/17_第1次修改                       ccb_warlock

     

    ===============================================

    紧接着上一篇“【c#笔记】可变长参数(params)”(https://www.cnblogs.com/straycats/p/14646210.html),我提到了整理java代码时看到了java的实现方案,故写了demo后在这做个记录。

     

    java中定义的方式与c#有些不同,这里还是根据之前的目录来做记录。

     

    ...是什么

    “...”是java用来标记是可变长类型。

     

    什么时候用...

    用于参数个数不确定、但类型相同的函数形参。

     

    怎么用

    比如下面的例子:

    首先定义一个test方法,形参arrs的类型来标记这是一个可变长参数。

    private void test(String... arrs)
    {
        if (null == arrs || 0 == arrs.length)
        {
            System.out.println("arrs is null or empty");
            return;
        }
    
        for(String arr : arrs){
            System.out.println("arr is " + arr);
        }
    }

    多个参数调用如下:

    test();
    test("123");
    test("abc", "def");

    控制台输出:

    arrs is null or empty
    arr is 123
    arr is abc
    arr is def

    限制条件

    1)在方法声明中,只允许有一个...标记的形参类型;

    2)在方法声明中,可变长参数之后不允许有其他参数;

    当然在可变长参数之前可以定义其他参数,例如:

    public void test(int index, String... arrs){
      // todo
    }

    3)由于...代表了可变长数组,不能在定义其重载函数时,定义可变长参数对应的参数为数组类型;

    举例:

    public void test(String... arrs){
      // todo
    }
    
    // 编译器会提示该函数在前面已定义
    public void test(String[] arrs){
      // todo
    }

    FAQ

    1.没有二义性的场景。

    当类中有下面2个方法的定义。

    public void test(String s1, String s2){
      // todo
    }
    
    public void test(String... arrs){
      // todo
    }

    此时调用函数test:

    // 调用的是test(string s1, string s2)
    test("123", "abc");

    该场景没有二义性,编译器会首先匹配非可变长参数的方法。强烈建议在业务代码中不要这样定义,而是将2个函数合并成1个。

    2.有二义性的场景。

    当类中有下面2个方法的定义。

    private void test(Integer... arrs){
        // todo
    }
    
    private void test(String... arrs) {
        // todo
    }

    此时调用函数test:

    // 编译器报错(Ambiguous method call. )
    test();

    该场景有二义性,因为编译器无法判断该场景该选择哪个函数调用。

    总结

    测试下来,java的可变长参数和c#用法近似。

  • 相关阅读:
    5、流程控制
    4、字典和元祖
    3、列表操作
    2、字符串和数据类型
    1.标识符练习
    使用xpath提取页面所有a标签的href属性值
    网页提取所有邮箱
    正则表达式
    提取包含QQ的文本为QQ邮箱
    python继承小demo
  • 原文地址:https://www.cnblogs.com/straycats/p/14672572.html
Copyright © 2011-2022 走看看