黑马程序员技术交流社区

标题: 关于public static void main(String[] args)格式问题? [打印本页]

作者: fea    时间: 2016-3-27 14:50
标题: 关于public static void main(String[] args)格式问题?
看视频的时候说这格式是固定不变的,我那天不小心把args记成了argy,然后就写HelloWord,编译通过后又抄在本子上,后面写其他的时候也一直写成argy,是后来继续看视频的时候发现是args才对。为什么我输错了,程序还是可以编译运行

作者: hkh3321313    时间: 2016-3-27 15:14
public static void main(String[] args)

  这绝对不是凭空想出来的,也不是没有道理的死规定,而是java程序执行的需要。

  jvm在试图运行一个类之前,先检查该类是否包含一个特殊方法。这个方法必须是公有的,以便在任何位置都能访问得到。这个方法必须是static的,因为这个方法不能依赖任何该类的实例即可运行,而非static的方法,在运行之前要先创建该类的实例对象。

  这个方法没有返回值。和C/C++程序不一样,java的程序默认都以常态结束,所以main不返回int。如果要以非常态结束程序,可以用System.exit(1)。

  这个方法必须可以接受数目不定的String类型的参数,因为运行者可能要附加运行参数。如java HelloWorld jack 100,这里的jack和100就是运行参数。

  为什么是String呢?因为String具有普遍性。任何字面形式都可以解释成String,而其他类型则不然(如jack就不能解释成整数或浮点数),所以用String来存储参数最合适。而因为参数数目不限一个,所以用了数组,即String[]。在Java 1.5以后,还可以写成String...,表示数目不定。

  至于参数的变量名可以任意,只要保证在方法内部按该变量名来获得参数就行了,从变量的作用角度来说,叫arguments或args当然是最合适的。

  至于这个方法的名字为什么一定是main,有历史原因,因为最早的C以main函数作为程序入口,java沿用了这个历史传统。
下面我们以一个例子一探究竟:

复制代码
package test;
public class MainTest {
   
    public static void main(String[] args)
    {
        for (int x=0; x<args.length; x++)
        {
            System.out.println(args[x]);
        }
        
    }
    public static void sysInfo(){
        System.out.println("call sysInfo()");
        
    }
}
public class MainDemo {
   
    /*
    public static void main(String[] args)
   
    public:权限修饰符,权限最大。
    static:随着MianDemo类的加载而加载,消失而消失。
    void:  没有返回值
    main: 函数名,jvm识别的特殊函数名
    (String[] args):定义了一个字符串数组参数
    */
   
    public static void main(String... args)
    {
        String[] arr = new String[]{"zhang","li","wang","zhao"};
        MainTest.main(arr);
        MainTest.sysInfo();
    }
   
    /*
    总结:
    1、main()函数是被jvm调用,jvm给main()传了一个长度为0的字符串的数组,也就是new String[0]
    2、可以通过类名.main()进行传值操作,因为main()方法是static的。
    */
}
复制代码
运行结果:
zhang
li
wang
zhao
call sysInfo()


作者: Poul    时间: 2016-3-27 15:52
我把args理解成一个数组名,是String类型的数组,所以main方法还可以写成main(String args[]),它的作用是用来存放向应用程序传递的参数的。我是用这个程序去理解的:
  1. class Test{
  2.   public static void mian(String[] args){
  3.     //循环获得数组args的值,并输出
  4.    for(int i = 0; i<args.length;i++)
  5.    System.out.println("args[i]的值为:"+args[i]);
  6.   }
  7. }
复制代码

要用记事本写好,然后用cmd编译,用cmd运行时,记得把值也赋上,即:java Test 你好 参数
作者: monZhang    时间: 2016-3-27 21:28
只有这个args 可以改变 别的都不能变  ,理解成String数组名字就行

作者: fea    时间: 2016-3-28 15:11
Poul 发表于 2016-3-27 15:52
我把args理解成一个数组名,是String类型的数组,所以main方法还可以写成main(String args[]),它的作用是 ...

复制过去后一直编译成功,运行失败,搞半天原来是main
作者: fea    时间: 2016-3-28 15:14
hkh3321313 发表于 2016-3-27 15:14
public static void main(String[] args)

  这绝对不是凭空想出来的,也不是没有道理的死规定,而是java ...

懂了,写什么都行,只是写args是最合适的
作者: fea    时间: 2016-3-28 15:15
monZhang 发表于 2016-3-27 21:28
只有这个args 可以改变 别的都不能变  ,理解成String数组名字就行

已经知道了
作者: 赵钱孙李王杨    时间: 2016-3-28 16:31
虽然看的有点懵
作者: Poul    时间: 2016-3-28 17:17
fea 发表于 2016-3-28 15:11
复制过去后一直编译成功,运行失败,搞半天原来是main

啊~抱歉~抱歉~老毛病~对不起哈~
作者: hkh3321313    时间: 2016-3-28 21:33
fea 发表于 2016-3-28 15:14
懂了,写什么都行,只是写args是最合适的

我说的有点啰嗦了⊙▽⊙




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2