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!");
}
}
}别人给我出的题,我不会,又告诉我的答案,可是看不懂(看晕了),谁能帮我解释一下流程是怎么走的,用到了哪些知识点?还有没有别的方法?
/*
* 完成如下代码,使其输出“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!");
}
}
}别人给我出的题,我不会,又告诉我的答案,可是看不懂(看晕了),谁能帮我解释一下流程是怎么走的,用到了哪些知识点?还有没有别的方法?
解决方案 »
- 一个js文件调用另一个js文件的函数
- 帮我解释下,为什么这个会有这个运行结果的区别
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 多文档界面是用多文档好还是用TAB页好啊?
- !!!!applet 错误:java.security.AccessControlException: access denied
- 运行class文件的问题
- 如何理解子类覆盖父类的成员变量?
- 新手提问~ 关于double运算和一条语句的解释
- 请问:如何实现动态更改数据库名的存储过程
- 怎么越界了
- 我的Java系统连接MySQL数据库,出现下面问题,请教!!1
- 为什么我定义了还是错误啊?
- mysql已经登录进去,连接还是报错。
不过{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!");
}
}
}
第一步: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!
/*
* 完成如下代码,使其输出“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!");
}
}
}测试正确~~哈哈哈哈啊哈哈
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!");
}
}
}
(1)运算符短路
(2){}实例代码块在新建对象实例的时候总是会执行
(3)命令行参数不是null,而是一个长度为0的数组
还是挺好玩的。
没看这个程序之前我不知道main方法也能被调用,还有递归的思想,以及30楼说到的那些多谢5楼、8楼的精彩回答,我看明白了。
理解一下这个代码就是了:
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执行,结果就出来了.
“world”是else语句 打印出来 的。
琢磨下很简单的。