我师兄面试碰到如下一个面试题,问下面一段程序,能不能运行成功,如果能成功,请分析结果,不能成功分析原因:
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... 不知道是什么东西哪位大侠分析一下。

解决方案 »

  1.   

    对了,程序的运行结果是:
    Hello
    OK
    [Ljava.lang.String;@de6ced
    Hello
    OK
    [Ljava.lang.String;@c17164想不通
      

  2.   

    String...这个是jdk1.5之后新增的功能,它相当于String[]数组。
    可以接受多个String类型的值
      

  3.   

    这个String...是可变参数列表,大致上跟String[] 是差不多的
    不过前者更灵活一些,除了能接受String[]类型的参数,还能有下面一些用法
    比如main(null), main(null, null), main("a"), main("a","b")等
      

  4.   

    结果很正确阿,首先调用main1(x=NULL)
    所以打印hello,ok,x这个数组的内存地址
    然后调用main2("why","a")
    但是这2个形参并没有在方法体中使用,main2()中只是继续调用了main1("why")
    所以继续打印hello,ok,和这次的x数组的内存地址
      

  5.   

    我想考查的就是main方法及...的语法 
      

  6.   

    前面几位都说了String...是JDK5.0新特性,可以接受0个或者多个String类型的参数,类似于数组
    说下最后的执行结果吧
    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
    结束
      

  7.   

    String...是可变参数 
    任何数量的字符串
      

  8.   


    哪里有嵌套?public static void main1(String...x) { 
    main();
    System.out.println("OK");
    System.out.println(x.toString());

    这里是不带参数的main哦。
      

  9.   

    String...
    jdk1.5新加的可变类型
    其实就是String[]public static void main(String... arg)
    等同于
    public static void main(String[] arg)
      

  10.   

    String... x是可变数组,
    public static void main(String... x){}
    调用就可以这样main("ff", "dd"); 如果有多个参数的话,可变参数要放到最后一位
      

  11.   

    呵呵,谢谢大家了,main()中的数组参数args好像会自动初始化,在内存中给它分配内存。即使我们在启动程序时不给它赋参数(即运行 java ***),JVM也会自动给args这个字符串数组初始化.
      

  12.   

    要报错吧
    public static void main(String... x){
       main1(); //这句会报错,没有参数,加上适当的参数应该就可以运行了
       main2(new String[]{"why","a"}); 

    加入参数后运行其实就是函数的反复调用的问题了,首先会执行这个类的main()函数,再在main函数里面一次调用,直到程序结束。
      

  13.   

    如果是jdk1.4,这段代码没有public static void main(String[])函数,根本运行不起来。 
      

  14.   

    这题确实出的很有水平! 如果对jdk 不了解!是根本找不到头绪的!谢谢楼主了!简单的分析, 这个程序看入口就行了
    public static void main(String... x){ main1(); 
    main2(new String[]{"why","a"}); 

    其他都可以当成普通方法调用!
      

  15.   

    拜托,排好点格式
    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"}); 
    }
      

  16.   

    main1(String[] x)和main1(String... x)是不同的
    调用main1(String[] x)时  必须传参数
    而调用main1(String... x) 时  可以不传参数(此时默认传的是new String[0])
    而传参数时  就是和main1(String[] x) 一样
      

  17.   

    Java方法的可变参数类型
      

  18.   

    public class TestMain { private static String message = "Hello"; public static void main() {
    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()
    }
      

  19.   

    x.toString()有输出此字符数组的地址功能吗
      

  20.   

    ToString(),返回对象本身,它已经是一个字符串,不知道这个内存地址哪里来?高手指教啊!