黑马程序员技术交流社区
标题:
我对可变参数的理解
[打印本页]
作者:
lzw123451
时间:
2013-2-26 04:57
标题:
我对可变参数的理解
public class Test2 {
public static void main(String[] args)
{
String[] a4 = new String[]{"a","b","c"};
String[] a5 = new String[]{"l","w","e"};
int[] a1 = new int[]{3,5,9};
System.out.println(Arrays.asList(a4)); //传一个数组 1
System.out.println(Arrays.asList(a4,a5)); //传两个数组,自动封装成一个数组 a4\a5是这个数组的两个元素 2
System.out.println(Arrays.asList("c","g","j")); //传三个字符串对象,自动封装成一个数组 3
System.out.println(Arrays.asList(1,2,3)); //自动封装成Integer对象,再自动封装成一个数组 4
System.out.println(Arrays.asList(a1)); //一个整型数组对象,自动封装成一个数组的一个元素 5
}
}
复制代码
结果是
[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