public class Test {
    /*
     * 完成如下代码,使其输出“Hello World!”
     */
    public static void main(String args[]) {
        //if(/*在此填写代码*/)
        if(args == null || new Test(){{Test.main(null);}}.equals("")){
            System.out.print("Hello ");
        }else{
            System.out.print("World!");
        }
    }
}别人给我出的题,我不会,又告诉我的答案,可是看不懂(看晕了),谁能帮我解释一下流程是怎么走的,用到了哪些知识点?还有没有别的方法?

解决方案 »

  1.   

    流程可以运行下面的代码,根据打印语句可以看出来。
    不过{Test.main(null);}这个代码看不懂,我一开始以为是static代码块可以不写static,但是运行时发现它和static代码块不一样
    public class Test {
    static
    {
    System.out.println("This is a static code block, only executed when class is loaded.");
    }

    {
    System.out.println("Why executed here?");///??
    }

        /*
         * 完成如下代码,使其输出“Hello World!”
         */
        public static void main(String args[]) {
            //if(/*在此填写代码*/)
            System.out.println("main method started");
            System.out.println(args == null ? "args is null" : "args isn't null");
            if(args == null || 
             new Test()
             {
             {Test.main(null);}
             }.equals(""))
            {
                System.out.print("Hello ");
            }else{
                System.out.print("World!");
            }
        }
    }
      

  2.   

    http://topic.csdn.net/u/20101009/20/1C312685-201B-447D-97BD-DA71A8A45664.html
      

  3.   

    这个也不算太难理解。
    第一步:args == null || new Test(){{Test.main(null);}}.equals("")
    此时args虽长度为0,但不为空,所以会经过第二个判断。
    注意:new Test(){{Test.main(null);}}这是关键,这只不过是new一个动态类(动态实现代码,就是说方法是在运行时定义的。)而已,其实也没什么特别的。再分解:{Test.main(null);}是动态类的静态代码,类调用时会先执行,于是静态代码调用Test的main方法。第二步:由第一步知道main被调用而且参数是null,自然就执行了System.out.print("Hello ");第三步:第二步执行完后动态类后执行代码 new Test(){{Test.main(null);}}.equals(""),这个当然为假,因为new出来的对象值无论如何不会等于""(除非改写toString()方法令其返回""),所以又会执行System.out.print("World!");over!
      

  4.   

    我觉得是匿名类哦··匿名类内部调用自身的main()方法··并且传了一个空值··这就满足了if的条件了··至于else语句为什么能执行·我觉得应该是递归调用的结果··是在if里的条件调用的时候执行的··
      

  5.   

    无聊的程序
    从命令行启动,args是不会为null的,也不会是""(因为本身不是字符串,是一个数组对象),一般都通过args.length为不为0来判断有没有参数,所以执行||后面的判断A,new一个Test对象,然后执行Test.main(null);而Test.main(null);是自己传一个null参数,所以调用Test.main(null)时,会满足args==null,这样||后面的代码就被短路了,然后执行System.out.print("Hello ");打印Hello,然后Test.main(null)调用结束,然后回到A,而A是new一个Test对象,很明显不会是"",所以程序走到else,执行System.out.print("World!");打印出World!
      

  6.   

    运行结果是hello word! 这样的程序真头晕
      

  7.   

    泪流满面啊,刚在javaeye也看到几个,直接if(true)也可以,用内部类也行,还有用javascript也行,很是强大啊
      

  8.   

    [code=Java]public class Test {
        /*
         * 完成如下代码,使其输出“Hello World!”
         */
        public static void main(String args[]) {        //if(/*在此填写代码*/)
            if(true){
             System.out.println("Hello World!");
             return;
         }        if(args == null || new Test(){{Test.main(null);}}.equals("")){
                System.out.print("Hello ");
            }else{
                System.out.print("World!");
            }
        }
    }测试正确~~哈哈哈哈啊哈哈
      

  9.   


    public class Test {
      /*
      * 完成如下代码,使其输出“Hello World!”
      */
      public static void main(String args[]) {  //if(/*在此填写代码*/)
      if(true){
      System.out.println("Hello World!");
      return;
      }  if(args == null || new Test(){{Test.main(null);}}.equals("")){
      System.out.print("Hello ");
      }else{
      System.out.print("World!");
      }
      }
    }
      

  10.   

    兄台此言差矣!这里面起码用到了这些知识点:
    (1)运算符短路
    (2){}实例代码块在新建对象实例的时候总是会执行
    (3)命令行参数不是null,而是一个长度为0的数组
    还是挺好玩的。
      

  11.   

    new Test(){{Test.main(null);}}这个算是匿名内部类?这个类是Test类的子类?
      

  12.   

    火龙果兄教训的是,但如30楼所说里面有几个知识点是值得品味的,
    没看这个程序之前我不知道main方法也能被调用,还有递归的思想,以及30楼说到的那些多谢5楼、8楼的精彩回答,我看明白了。
      

  13.   

    如果把题目换一下,我想应该容易一点看:
    理解一下这个代码就是了:
    new Test(){{Test.main(null);}};在构造一个对象的时候,也执行了一些代码.new Test(){{System.out.println("aaa");}};Test  t = new Test(){{System.out.println("aaa");}};
    这里t.equals("")明显是false嘛.就是两个条件都是false.应该是执行后边 的else但在中间又执行Test.main(null);这时候就是args==null输出Hello,然后返回刚才的else执行,结果就出来了.
      

  14.   

    “hello”打印出来的是Test.main(null)这句打印的。
    “world”是else语句 打印出来 的。
    琢磨下很简单的。