日期:2014-05-20  浏览次数:20745 次

Java版另类 Hello World
Java code
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!");
        }
    }
}
别人给我出的题,我不会,又告诉我的答案,可是看不懂(看晕了),谁能帮我解释一下流程是怎么走的,用到了哪些知识点?还有没有别的方法?

------解决方案--------------------
这个也不算太难理解。
第一步: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!
------解决方案--------------------
无聊的程序
从命令行启动,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!
------解决方案--------------------
这种题目是国内程序学习的一大特色!好好的语法不去用,专走这些没用歪门邪道!
------解决方案--------------------
探讨
这种题目是国内程序学习的一大特色!好好的语法不去用,专走这些没用歪门邪道!