黑马程序员技术交流社区

标题: 我对可变参数的理解 [打印本页]

作者: lzw123451    时间: 2013-2-26 04:57
标题: 我对可变参数的理解
  1. public class Test2 {
  2. public static void main(String[] args)
  3. {
  4. String[] a4 = new String[]{"a","b","c"};
  5. String[] a5 = new String[]{"l","w","e"};
  6. int[] a1 = new int[]{3,5,9};

  7. System.out.println(Arrays.asList(a4)); //传一个数组 1
  8. System.out.println(Arrays.asList(a4,a5)); //传两个数组,自动封装成一个数组 a4\a5是这个数组的两个元素 2
  9. System.out.println(Arrays.asList("c","g","j")); //传三个字符串对象,自动封装成一个数组 3
  10. System.out.println(Arrays.asList(1,2,3)); //自动封装成Integer对象,再自动封装成一个数组 4
  11. System.out.println(Arrays.asList(a1)); //一个整型数组对象,自动封装成一个数组的一个元素 5

  12. }

  13. }

复制代码
结果是
[a, b, c]
[[Ljava.lang.String;@dc8569, [Ljava.lang.String;@1bab50a]
[c, g, j]
[1, 2, 3]
[[I@150bd4d]


public static<T> List<T> asList(T...a)     //1.5以后的版本   传入元素 自动封装成数组(如果这个元素不是唯一个数组的话)
public static List asList(Object[] a)   //旧版本

由上面可以看出,可变参数
如果传入的是有且只有一个数组(并且这个数组里面储存的是对象), 会认为兼容旧版本 这个数组里面的各个对象都是参数。  如 1
如果传入等于或超过两个对象(无论任何对象), 都会认为是新版本方法,把这些对象封装成一个数组,把这两个或多个对象当成参数。2、3、4


由此可以看出 asList()方法 原意接收的参数并不是数组,而是对象,然后把这些对象在内部加进同一集合中返回。
但由于要传入对象的个数并不清楚,也为了内部要遍历,就用一个数组来装。
其他方法的可变参数都与上面的一致。

file:///C:/Users/Administrator/AppData/Local/youdao/ynote/images/DD3F4F5324AC4602BC9F9B45BE67E215/7135946AF6604F8E9AC72CDE93AE0701.jpg
但对于上图中,张老师说的主函数传入参数 为什么要用这种方式,不是十分理解。
因为主函数接收的参数也是可变参数才是

我看了下文档 关于invoke方法里面有一句话
“对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。”
这样看来,貌似是invoke方法的问题, 但什么事以便于基本形参相匹配呢?



作者: lzw123451    时间: 2013-2-26 04:59
本帖最后由 李志卫 于 2013-2-26 05:09 编辑

有个图片挂了    代码是这样的
                     String startingClassName= args[0];
                Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
                mainMethod.invoke(null,new Object[]{new String[]{"111","222","333"}});




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2