鱼C论坛

 找回密码
 立即注册
查看: 2070|回复: 1

[技术交流] JAVA:public static void main(String args[]) 详解

[复制链接]
发表于 2022-4-12 17:16:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等。

在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下:

/**
* Java中的main()方法详解
*/
public class HelloWorld {
public static void main(String args[]) {
        System.out.println("Hello World!");
    }
}

一、先说类:

HelloWorld 类中有main()方法,说明这是个java应用程序,通过JVM直接启动运行的程序。

既然是类,java允许类不加public关键字约束,当然类的定义只能限制为public或者无限制关键字(默认的)。

二、再说main()方法

这个main()方法的声明为:public static void main(String args[])或
public static void main(String args[])

区别
执行效果上没有不同, 但在语法意义上略有不同.
比如, String与String[], 前者叫字符串类型而后者叫字符串数组类型.
String args[]单从类型上来讲属于字符串类型, 而从变量本身来讲是一个数组类型, 因此组合起来说明此变量为一个字符串类型的数组, 也就是说数组中的所有元素都为String类型.
String[] args单从类型上来讲属于字符串数组类型, 而从变量本身来讲就是一个单纯的引用变量, 因此这种方式可以更明显地体现出是否为数组这一点. 因为从类型上就可以直接看出变量为一数组类型引用.
正如第一句话所说的那样, 单单两句是比较不出什么不同的, 但如果你这样写.
String args[], argt;
String[] args, argt;
这就有很显示的差异了. 在第一句中args是字符串数组类型, 而argt则就是字符串变量. 在第二句中args与argt都是字符串数组类型.

那就是:string[] args,声明一个String数组,名字叫args. string args[],声明一个叫args的数组,类型是String.
其实功能作用是完全一样的,两种写法都可以!
这是数组的两种写法,
大多数程序员喜欢使用String[] args这种风格的写法,因为它把元素类型 String[] 与变量名清晰的分开了。

为什么要这么定义main方法,和JVM的运行有关系。

当一个类中有main()方法,执行命令“java 类名”则会启动虚拟机执行该类中的main方法。

由于JVM在运行这个Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要是限制为public static。

对于java中的main方法,jvm有限制,不能有返回值,因此返回值类型为void。

main方法中还有一个输入参数,类型为String[],这个也是java的规范,main()方法中必须有一个入参,类细必须String[],至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和sun java规范范例中mian参数名保持一致,取名为args。

因此,main()方法定义必须是:“public static void main(String 字符串数组参数名[])”。

三、main()方法的声明
1)public关键字,这个好理解,声明主函数为public就是告诉其他的类可以访问这个函数。

(2)static关键字,告知编译器main函数是一个静态函数。也就是说main函数中的代码是存储在静态存储区的,即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符,那么编译不会出错,但是如果你试图执行该程序将会报错,提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象),所以其main()方法也不会存。而使用static修饰符则表示该方法是静态的,不需要实例化即可使用。

(3)void关键字表明main()的返回值是无类型。

(4)参数String[] args,这是本文的重点。

第一、程序使用者可以在命令行状态下向某个类传递参数。看下面的例子:

public class ArgsDemo {

    public static void main(String[] args) {

        String str = new String();

        for (int i = 0; i < args.length; i++) {

            System.out.println(args[i]);

            str += args[i];

        }

        System.out.println(str);

    }

}

使用javac ArgsDemo.java命令生成ArgsDemo.class文件;然后使用“java ArgsDemo 参数一 参数二 参数三 …”的格式向ArgsDemo类传递参数。该示例程序将首先输出参数,然后输出所有参数的和。比如java ArgsDemo a b c,将得到这样的输出:

a

b

c

abc

需要注意的是,如果这里的循环条件不是i Exception in thread “main” java.lang.ArrayIndexOutOfBoundException:3

at ArgsDemo.main(ArgsDemo.java:5)

第二、可以在另一个类中向包含main()的类传递参数,如下例:

public class A {

    public static void main(String[] args)

    {

        for(int i=0;i
        System.out.println(args[i]);

    }

}

public class B {

    public static void main(String[] args)

    {

        c = new A();

        String[] b = {"111","222","333"};

        c.main(b);

    }

}

首先定义一个class A,在A中定义一个main()函数,在该函数中输出参数args。然后定义一个classB,在B中初始化一个A的实例c,然后向c传递参数,并且调用c的main方法打印出传入的参数值。输出结果如下:

111

222

333

由于main()函数是静态函数,即不需要实例化也能使用,所以B使用下面的写法也能完成相同的功能:

public class B {

    public static void main(String[] args)

    {

//A c = new A();

        String[] b = {"111","222","333"};

        A.main(b);

    }

}

参数args的主要作用是为程序使用者在命令行状态下与程序交互提供了一种手段。此外在其他类中直接使用main()函数,并传递参数也是可行的,虽然这种方法不太常用,但毕竟为我们提供了一种选择。

三、main()方法中可以throw Exception
因此main()方法中可以抛出异常,main()方法上也可以声明抛出异常。

比如,下面这个写法是正确的:

public class TestMain {
public static void main(String[] args) throws Exception {
                System.out.println("哈哈哈哈哈");
throw new Exception("");
        }
}

运行结果:

哈哈哈哈哈 Exception in thread “main” java.lang.Exception:
at maintest.TestMain.main(TestMain.java:11) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90) Process finished with exit code 1

四、给出HelloWorld的另外一个版本

/**
* 变态版的HelloWorld.呵呵
*/
public class HelloWorld2 {
static {
        System.out.println("Hello Wordld!");
    }
public static void main(String args[]){
        System.exit(0);
    }
}

这个main()方法执行的内容就一句"System.exit(0);“ ,目的是让程序正常结束。那“HelloWorld!”是从哪里打印的,秘密就是在static打印的,因为static代码块的内容会在main调用前调用。

main方法作为一个特殊的规范,与普通的方法有很大区别,限制很多,理解其原理需要学习JVM相关知识。是Java中学习中大障碍。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-9 19:22:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 11:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表