- 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!
------解决方案--------------------
这种题目是国内程序学习的一大特色!好好的语法不去用,专走这些没用歪门邪道!
------解决方案--------------------