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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangpan 中级黑马   /  2013-7-6 19:47  /  1661 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-7 22:51 编辑

  1. <P>public class RandomTest {</P>
  2. <P>
  3. public static void main(String[] args) {
  4.   System.out.println("(args==null)="+(args==null));
  5.   boolean flag=false;
  6.   if(args==null|| (flag = new RandomTest(){{RandomTest.main(null);}}.equals(null))){
  7.       System.out.println("-------if-----");
  8.       System.out.print("hello");
  9.       System.out.println("flag="+flag +" (args==null)="+(args==null));
  10.   }else{
  11.       System.out.println("-------else-----");
  12.       System.out.print("world");
  13.       System.out.println("flag="+flag +" (args==null)="+(args==null));
  14.    }</P>
  15. <P>
  16. }
  17. </P>
  18. <P>}</P>
复制代码
运行结果是这样的:
(args==null)=false
(args==null)=true
-------if-----
helloflag=false (args==null)=true
-------else-----
worldflag=false (args==null)=false

问题一,为什么一进入主函数的时候,它的参数args不等于null呢?那它到底存的是什么东西?
问题二,new RandomTest(){{RandomTest.main(null);}}这句代码,为什么去掉里面那层大括号就不对呢?
麻烦大家来解释一下~

评分

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

查看全部评分

7 个回复

倒序浏览
一、刚进主函数时,args是一个长度为0的String数组对象,是有对象的,虽然长度为0.第二次调用main(null)再进主函数时指明了传进的是null所以第二次为true.二、这是一个匿名内部类,最外层大括号是说明继承这个RnadomTest类,而第二层大括号是一个构造代码块,对象创建时执行。如果没有第二层,那就是RandomTest.main(null);这句话直接在子类里面。而这类里面是不能直接有执行语句的。必须在一个方法或者代码块里

评分

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

查看全部评分

回复 使用道具 举报
草貌路飞 发表于 2013-7-6 19:58
一、刚进主函数时,args是一个长度为0的String数组对象,是有对象的,虽然长度为0.第二次调用main(null) ...

谢谢你的解答哦~第二个问题明白了,第一个问题:args里面存的是什么东西呢?在eclipse调试时,显示args=String[0],你知道是什么意思么?
回复 使用道具 举报
本帖最后由 toShareBeauty 于 2013-7-6 21:16 编辑
wangpan 发表于 2013-7-6 20:34
谢谢你的解答哦~第二个问题明白了,第一个问题:args里面存的是什么东西呢?在eclipse调试时,显示args=S ...

在命令行里面启动程序,如果不传参数,相当于String[] args =  new String[0];new String[0] 也是要在堆内存中给这个数组分配内存的,只是分配的内存不如 new String[1], 这么多。数组中的元素所占用的堆内存只是数组这个对象中成员的一部分,从已经暴露的来看至少数组还有个 length 成员是不。而本程序中 new RandomTest(){{RandomTest.main(null);}}.equals(null) 这个内部局部函数这里,却是在程序中使用类名调用静态函数,这里传的参数是 null,所以和命令行里面启动不传参数不同。这个程序真有点意思,说明了引用类型的形成可以直接传 null,编译也是可以通过的,二是数组类型 new Type[0] 不是 null,三是使用 java 命令在命令行调用一个程序,如果不传参数默认情况下 args = new String[0],四是,java 命令对应 windows 来说也是一个命令,从命令行角度来看” java java程序名 “这个命令中,java 程序名就是参数,只是java命令启动虚拟机的时候,对 java 这个命令的参数处理过了,重新创建的一个 String[counts] 数组,counts 这个变量就是 java程序名后面字符串的个数,五是这里面居然还用了局部内部类来创建对象。

评分

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

查看全部评分

回复 使用道具 举报
我看这个程序好多人在问,请问一下,为什么我没有看到这个程序出自哪个地方呢?
回复 使用道具 举报
wangpan 发表于 2013-7-6 20:34
谢谢你的解答哦~第二个问题明白了,第一个问题:args里面存的是什么东西呢?在eclipse调试时,显示args=S ...

就是执行main的参数么,你是可以调用main的时候传参数的。如在命令行执行 java ClassDemo arg1 arg2 arg3..
也可以通过在eclipse中调用时配置run configuration 里面的Arguments
回复 使用道具 举报
toShareBeauty 发表于 2013-7-6 20:56
我看这个程序好多人在问,请问一下,为什么我没有看到这个程序出自哪个地方呢? ...

我是在论坛看到的。想了想,自己也不明白才问的O(∩_∩)O~
回复 使用道具 举报
楼主您好,我已将您帖子的状态改成“已解决”,对此如有疑问可以通过QQ632763270和我取得联系

-------------------坚持学习,黑马因你而精彩---------------
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马