• Java的不定参数(eg:Object...)(转)


    第一个例子: 

    public class VariArgs {  
      
        public static void main(String[] args) {  
            test();  
            test("aaa");  
            test("aaa", "bbb");  
            test("aaa", "bbb", "ccc");  
        }  
      
        public static void test(String... args) {  
            System.out.println(args.getClass());  
            for (String arg : args) {  
                System.out.println(arg);  
            }  
        }  
    }  

    第二个例子:

    public class VariArgs {  
      
        public static void main(String[] args) {  
            test("aaa");  
            test("aaa", "bbb");  
            test("aaa", "bbb", "ccc");  
        }  
      
        public static void test(String arg, String... args) {  
            System.out.println(arg);  
            System.out.println("----------------");  
            for (String s : args) {  
                System.out.println(s);  
            }  
        }  
    }  

    运行一下,这个不定长度参数的类型为String[],即字符串数组。 

    从上面可以看出,如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行。 

    不过,不定参数有两个规定:第一,方法的参数列表中最多只有一个不定长度的参数;第二,就是不定长度的数组的位置必须是最后一个参数。不然不能通过编译。 

    对于第一个规定,是因为如果有多于一个不定长度的参数,当真正调用这个方法的时候,JVM、将不知道前面的不定长度参数有多长, 下一个参数是从哪里开始. 

    对于第二个参数也是一样,编译器不知道不定长度参数的长度,无法确定从哪里开始下一个参数。 

    【反例】以下是几种不正确使用不定长度参数的例子,请不要这样写程序: 

    public static void test(Object... objs, Object obj);  
      
    public static void test(Object obj1, Object... objs, Object obj2);  
      
    public static void test(Object... objs1, Object... objs2);  

    不定参数的方法可以重载。(重载就是方法名相同,而方法的参数列表不同) 

    下面给出重载的示例: 

    public class VariArgs {  
      
        public static void main(String[] args) {  
            test("aaa");  
            test("aaa", "bbb");  
            test("aaa", "bbb", "ccc");  
        }  
      
        public static void test(Object... args) {  
        }  
      
        public static void test(String arg, String... args) {  
        }  
    }  

    可以看出文章开头给出的两个例子的区别,就是第二个例子比第一个例子的test方法的参数多出了一个String arg,从感觉上没有太大的区别,这有点像编译原理的*和+的区别。第一个test方法指可以有0或N个String做参数,但第二个test方法指至少一个String做为参数。 

    然后结合重载来看,把第一个例子和第二个例子合并成一个类,得到以下代码: 

     1 public class VariArgs {  
     2   
     3     public static void main(String[] args) {  
     4         test();  
     5         test("aaa");  
     6         test("aaa", "bbb");  
     7         test("aaa", "bbb", "ccc");  
     8     }  
     9   
    10     public static void test(String... args) {  
    11         System.out.println(args.getClass());  
    12         for (String arg : args) {  
    13             System.out.println(arg);  
    14         }  
    15     }  
    16   
    17     public static void test(String arg, String... args) {  
    18         System.out.println(arg);  
    19         System.out.println("----------------");  
    20         for (String s : args) {  
    21             System.out.println(s);  
    22         }  
    23     }  
    24 }  

    编译这个程序,结果是编译不通过。为什么?程序编译到第五行时,不能确定test("aaa")该用第10行的test方法还是第17行的方法,因为两个方法都可以有相同的参数列表。都能精确匹配上参数列表,编译器在这种情况下只好报出编译不能通过的错误。所以在重载这样的方法时,注意参数列表,不要使两个方法可以有同样的参数列表。

    参考:

    http://blog.csdn.net/djun100/article/details/10134419(以上内容转自此篇文章)

  • 相关阅读:
    __init__.py文件的作用
    is is not == !=之间的区别
    使用七牛上传头像
    flask的request的用法
    Mac各个文件夹表示的意思
    sqlalchemy的基本的使用
    将Cygwin Emacs设为Windows explorer默认打开程序
    使用Stardict命令行版本sdcv
    坚持使用GNU/Linux
    在Windows上创建同样的Linux操作环境
  • 原文地址:https://www.cnblogs.com/EasonJim/p/7836244.html
Copyright © 2020-2023  润新知