A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵佳 初级黑马   /  2013-7-6 09:31  /  1711 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵海洋 于 2013-7-6 18:33 编辑

public class RandomTest {
public static void main(String[] args) {
  if(args==null|| new RandomTest(){{RandomTest.main(null);}}.equals(null)){
   System.out.print("hello");
  }else{
   System.out.print("world");
  }
}
}

这个输出的是helloworld 请问new RandomTest(){{RandomTest.main(null);}}.equals(null))这句代码是什么意思?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览
无限次的调用了主方法main()

当命令行参数为空时即args=null时 不执行new RandomTest(){{RandomTest.main(null);}}.equals(null)
输出为hello,
当命令行参数不为空时执行
new RandomTest(){{RandomTest.main(null);}}.equals(null),
代码中RandomTest.main(null)的值为word,
new RandomTest(){{RandomTest.main(null);}}.equals(null)等价于 new RandomTest(){  System.out.print("world");}.equals(null),
而new RandomTest(){  System.out.print("world");}为null

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
我的是这样理解的..系统刚进来时判断 if(args==null|| new RandomTest(){{RandomTest.main(null);}}.equals(null)),这时args并不为空,只是这个String数组长度为0而已,还是有对象存在的。前半句为false所以就执行后面的new RandomTest(){{RandomTest.main(null);}}.equals(null)。这里有生成一个匿名内部类的对象,对象继承自RandomTest类自己。RandomTest.main(null);  main方法也是静态方法可以通过类名直接调用,所以这里是再次调用了main方法,而这次传入的args就是null了,所以前半句判断完就输出了hello,然后又回来接着判断new RandomTest(){{RandomTest.main(null);}}.equals(null)。因为还没完。这时比较的是new RandomTest(){{RandomTest.main(null);}}是不是为null,但这个对象是存在的,所以这个判断也为假。两边判断都为假所以就打印word了。

点评

思路清晰  发表于 2013-7-6 11:33

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报 1 0
  1. public class RandomTest {

  2. /**
  3. *
  4. * 运行结果:
  5. * (args==null)=false
  6. * (args==null)=true
  7. * -------if-----
  8. * helloflag=false (args==null)=true
  9. * -------else-----
  10. * worldflag=false (args==null)=false
  11. *
  12. *
  13. */
  14. public static void main(String[] args) {
  15. System.out.println("(args==null)="+(args==null));//程序开始进入主函数,这里是false,说明args!=null;
  16. boolean flag=false;
  17. if(args==null|| (flag = new RandomTest(){{RandomTest.main(null);}}.equals(null))){//程序执行到这行,判断args==null为false,接着执行右边,
  18.                                                                 //右边的new是一个匿名内部类,相当于新建了一个RandomTest实例对象,
  19.                                                                  //里面再次调用了main方法,传入了参数null,所以程序在这里要再去执行一次main方法
  20.                                                                   //这时,又输出了第二行”(args==null)=true“。又往下执行到if,
  21.                                                              //这时,因为args==null是true,所以直接进入if语句,输出了hello;
  22.                                                                 //此时,打印出的flag为false,是因为初始化为false,
  23.                                                                  //而不是这句new RandomTest(){{RandomTest.main(null);}}.equals(null)的执行结果,因为此时这句还没有执行完。
  24.                                                               //等打印输出完if里的东西,接着判断equals(null),结果为false赋值为flag
  25.                                                                //这时,因为if条件都为false,所以执行else里面的,所以打印world,
  26.                                                                //这时,打印的false才是赋值以后的,而且(args==null)返回false
  27. System.out.println("-------if-----");
  28. System.out.print("hello");
  29. System.out.println("flag="+flag +" (args==null)="+(args==null));
  30. }else{
  31. System.out.println("-------else-----");
  32. System.out.print("world");
  33. System.out.println("flag="+flag +" (args==null)="+(args==null));
  34. }


  35. }


  36. }
复制代码
至于为什么args是不等于null的,我也不知道为什么?还有那个匿名内部类中大括号里面直接还有一个大括号,也不知道为什么?希望能看到大神回答
回复 使用道具 举报
wangpan 发表于 2013-7-6 16:54
至于为什么args是不等于null的,我也不知道为什么?还有那个匿名内部类中大括号里面直接还有一个大括号,也 ...

把你的问题整理为帖子发表下
回复 使用道具 举报
赵海洋 发表于 2013-7-6 18:33
把你的问题整理为帖子发表下

好的~呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马