我师兄面试碰到如下一个面试题,问下面一段程序,能不能运行成功,如果能成功,请分析结果,不能成功分析原因:
public class TestMain {
private static String message = "Hello";
public static void main() {
System.out.println(message);
}
public static void main1(String...x) { main();
System.out.println("OK");
System.out.println(x.toString());
}
public static void main2(String[] a) {
main1("why");
}
public static void main(String... x){ main1();
main2(new String[]{"why","a"});
}
}
其中在main()中有一个String... 不知道是什么东西哪位大侠分析一下。
public class TestMain {
private static String message = "Hello";
public static void main() {
System.out.println(message);
}
public static void main1(String...x) { main();
System.out.println("OK");
System.out.println(x.toString());
}
public static void main2(String[] a) {
main1("why");
}
public static void main(String... x){ main1();
main2(new String[]{"why","a"});
}
}
其中在main()中有一个String... 不知道是什么东西哪位大侠分析一下。
Hello
OK
[Ljava.lang.String;@de6ced
Hello
OK
[Ljava.lang.String;@c17164想不通
可以接受多个String类型的值
不过前者更灵活一些,除了能接受String[]类型的参数,还能有下面一些用法
比如main(null), main(null, null), main("a"), main("a","b")等
所以打印hello,ok,x这个数组的内存地址
然后调用main2("why","a")
但是这2个形参并没有在方法体中使用,main2()中只是继续调用了main1("why")
所以继续打印hello,ok,和这次的x数组的内存地址
说下最后的执行结果吧
1,函数的入口是public static void main(String... x){ main1();
main2(new String[]{"why","a"}); ,这个里面的main1()没有传入参数
2,开始调用public static void main1(String...x)
3,开始调用public static void main() 输出"hellow"
4,执行这两句System.out.println("OK");
System.out.println(x.toString());
5,接着执行入口函数中的main2(new String[]{"why","a"}); ,然后调用public static void main2(String[] a)
6,执行main1("why"); 调用public static void main1(String...x)
回到3
回到4
结束
任何数量的字符串
哪里有嵌套?public static void main1(String...x) {
main();
System.out.println("OK");
System.out.println(x.toString());
}
这里是不带参数的main哦。
jdk1.5新加的可变类型
其实就是String[]public static void main(String... arg)
等同于
public static void main(String[] arg)
public static void main(String... x){}
调用就可以这样main("ff", "dd"); 如果有多个参数的话,可变参数要放到最后一位
public static void main(String... x){
main1(); //这句会报错,没有参数,加上适当的参数应该就可以运行了
main2(new String[]{"why","a"});
}
加入参数后运行其实就是函数的反复调用的问题了,首先会执行这个类的main()函数,再在main函数里面一次调用,直到程序结束。
public static void main(String... x){ main1();
main2(new String[]{"why","a"});
}
其他都可以当成普通方法调用!
public static void main(String... x){ main1();
main2(new String[]{"why","a"});
}
我看漏了main1(); 。public static void main(String... x){
main1();
main2(new String[]{"why","a"});
}
调用main1(String[] x)时 必须传参数
而调用main1(String... x) 时 可以不传参数(此时默认传的是new String[0])
而传参数时 就是和main1(String[] x) 一样
System.out.println(message);//3. 输出“Hello”
} public static void main1(String...x) {
main();//2.去找main()
System.out.println("OK");//4. 输出“OK”
System.out.println(x.toString());//5. 输出数组x的toString形式,x在这里是空数组
} public static void main2(String[] a) {
main1("why"); //再去找main1(),参数是"why",然后重复2-5
} public static void main(String... x){ //程序入口在这儿
main1();//1.去找main1()
main2(new String[]{"why","a"});//6. 去找main2()
}
}