java main函数中的参数_java中main函数的参数问题

package test;

public class RandomTest {

/**

*

* 运行结果:

* (args==null)=false

* (args==null)=true

* -------if-----

* helloflag=false (args==null)=true

* -------else-----

* worldflag=false (args==null)=false

*

*

*/

public static void main(String[] args) {

System.out.println("(args==null)="+(args==null));//程序开始进入主函数,这里是false,说明args!=null;

boolean flag=false;

//程序执行到if语句,判断args==null为false,接着执行右边,

//右边的new是一个匿名内部类,相当于新建了一个RandomTest实例对象,

//里面调用了main方法,传入了参数null,所以程序在这里要再去执行一次main方法

//这时,又输出了第二行”(args==null)=true“。又往下执行到if,

//这时,因为args==null是true,所以直接进入if语句,输出了hello;

//此时,打印出的flag为false,是因为初始化为false,

//而不是这句new RandomTest(){{RandomTest.main(null);}}.equals(null)的执行结果,因为此时这句还没有执行完。

//等打印输出完if里的东西,接着判断equals(null),结果为false赋值为flag

//这时,因为if条件都为false,所以执行else里面的,所以打印world,

//这时,打印的false才是赋值以后的,而且(args==null)返回false

if(args==null|| (flag = new RandomTest(){{RandomTest.main(null);}}.equals(null))){

System.out.println("-------if-----");

System.out.print("hello");

System.out.println("flag="+flag +" (args==null)="+(args==null));

}else{

System.out.println("-------else-----");

System.out.print("world");

System.out.println("flag="+flag +" (args==null)="+(args==null));

}

}

}

问题1:main函数的参数args并不等于null,那开始它是什么东东呢?

在命令行里面启动程序,如果不传参数,相当于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程序名后面字符串的个数,五是这里面居然还用了局部内部类来创建对象。

问题2:new RandomTest(){{RandomTest.main(null);}}.equals(null));这行代码中大括号里直接又一个大括号,是什么语法。

这是一个匿名内部类,最外层大括号是说明继承这个RnadomTest类,而第二层大括号是一个构造代码块,对象创建时执行。如果没有第二层,那就是RandomTest.main(null);这句话直接在子类里面。而这类里面是不能直接有执行语句的。必须在一个方法或者代码块里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值