- 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方法的问题, 但什么事以便于基本形参相匹配呢?
|
|