Java main() 方法 – public static void main(String[] args)
在Java程序中,程序开始执行的点或只是Java程序的入口点是main()方法。因此,它是Java最重要的方法之一,正确理解它是非常重要的。
Java编译器或 JVM 在开始执行Java程序时会查找 main 方法。 main 方法的签名需要以特定的方式让 JVM 将该方法识别为其入口点。如果我们更改方法的签名,程序会编译但不会执行。
Java程序的执行,调用Java.exe 。 Java.exe 反过来进行Java Native Interface 或 JNI 调用,它们会加载 JVM。 Java.exe 解析命令行,生成一个新的字符串数组,并调用 main() 方法。一个守护线程附加到 main 方法,并且这个线程只有在Java程序停止执行时才会被销毁。
main() 方法最常见的语法:
Java
// Java Program to demonstrate the
// syntax of the main() function
class GeeksforGeeks {
public static void main(String[] args)
{
System.out.println("I am a Geek");
}
}
Java
// Java Program to demonstrate the
// use of any other access modifier
// other than public
class GeeksforGeeks {
private static void main(String[] args)
{
System.out.println("I am a Geek");
}
}
Java
// Java Program to demonstrate the
// error occurred when we dont use the
// static keyword in the main() method
class GeeksforGeeks {
public void main(String[] args)
{
System.out.println("I am a Geek");
}
}
Java
// Java Program to demonstrate the
// error occurred when we dont use the
// void return type in the main() method
class GeeksforGeeks {
public static int main(String[] args)
{
System.out.println("I am a Geek");
return 1;
}
}
Java
// Java Program to demonstrate the
// error occurred when we name the
// main() method as main.
class GeeksforGeeks {
public static void myMain(String[] args)
{
System.out.println("I am a Geek");
}
}
Java
// Java Program to demonstrate
// the working of String[] args
// in the main() method
class GeeksforGeeks {
// Commamd-Line Code ->
// javac GeeksforGeeks.java
// java GeeksforGeeks 1 2 3
public static void main(String[] args)
{
for (String elem : args)
System.out.println(elem);
}
}
Java
class GeeksforGeeks {
public static int main(String[] args)
{
System.out.println("GeeksforGeeks");
}
}
Java
class GeeksforGeeks {
public static int main(String[] args) {
System.out.println("GeeksforGeeks");
return 0;
}
}
I am a Geek
解释: public static void main 语句中的每个单词对 JVM 都有意义。
1.公开
它是一个访问修饰符,它指定从哪里以及谁可以访问该方法。公开main()方法使其全局可用。它是公开的,以便 JVM 可以从类外部调用它,因为它不存在于当前类中。
Java
// Java Program to demonstrate the
// use of any other access modifier
// other than public
class GeeksforGeeks {
private static void main(String[] args)
{
System.out.println("I am a Geek");
}
}
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
2.静态
它是一个与方法相关联的关键字,使其成为与类相关的方法。 main()方法是静态的,因此 JVM 可以在不实例化类的情况下调用它。这也节省了内存的不必要浪费,这些内存将被声明为仅用于调用 JVM 的main()方法的对象使用。
Java
// Java Program to demonstrate the
// error occurred when we dont use the
// static keyword in the main() method
class GeeksforGeeks {
public void main(String[] args)
{
System.out.println("I am a Geek");
}
}
Error: Main method is not static in class test, please define the main method as:
public static void main(String[] args)
3. 作废
它是一个关键字,用于指定方法不返回任何内容。由于main()方法不返回任何内容,因此它的返回类型为void 。一旦main()方法终止, Java程序也会终止。因此,从main()方法返回没有任何意义,因为 JVM 不能对它的返回值做任何事情。
Java
// Java Program to demonstrate the
// error occurred when we dont use the
// void return type in the main() method
class GeeksforGeeks {
public static int main(String[] args)
{
System.out.println("I am a Geek");
return 1;
}
}
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
4.主要
它是Java主方法的名称。它是 JVM 寻找作为Java程序起点的标识符。这不是关键字。
Java
// Java Program to demonstrate the
// error occurred when we name the
// main() method as main.
class GeeksforGeeks {
public static void myMain(String[] args)
{
System.out.println("I am a Geek");
}
}
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
5.字符串[]参数
它存储Java命令行 arguments 并且是Java.lang.String类类型的数组。在这里,String 数组的名称是args ,但它不是固定的,用户可以使用任何名称来代替它。
Java
// Java Program to demonstrate
// the working of String[] args
// in the main() method
class GeeksforGeeks {
// Commamd-Line Code ->
// javac GeeksforGeeks.java
// java GeeksforGeeks 1 2 3
public static void main(String[] args)
{
for (String elem : args)
System.out.println(elem);
}
}
输出:
1
2
3
除了上面提到的 main 签名之外,您还可以使用public static void main(String args[])或public static void main(String... args)来调用Java中的 main函数。如果 main 方法的形参与字符串数组的形参匹配,则调用 main 方法。
主要方法可以是int吗?如果不是,为什么?
Java
class GeeksforGeeks {
public static int main(String[] args)
{
System.out.println("GeeksforGeeks");
}
}
Java不会隐式返回 int,即使我们将 main 的返回类型声明为 int。我们会得到一个编译时错误:
prg1.java:6: error: missing return statement
}
^
1 error
Java
class GeeksforGeeks {
public static int main(String[] args) {
System.out.println("GeeksforGeeks");
return 0;
}
}
现在,即使我们自己明确地返回 0 或整数,从 int main 中。我们得到一个运行时错误。
Error: Main method must return a value of type void in class GeeksforGeeks, please
define the main method as:
public static void main(String[] args)
说明:从 main 返回 int 的C 和 C++ 程序是操作系统的进程。在 C 和 C++ 中从 main 返回的int 值是退出代码或退出状态。 C 或 C++ 程序的退出代码说明了程序终止的原因。退出代码 0 表示成功终止。但是,非零退出状态表示错误。
例如:退出代码 1 描述了其他错误,例如“除以零”。
任何子进程的父进程一直在等待子进程的退出状态。并在收到子进程的退出状态后,从进程表中清理子进程并释放分配给它的资源。这就是为什么 C 和 C++ 程序(它们是 OS 的进程)必须显式或隐式地从 main 传递其退出状态的原因。
但是, Java程序在JVM中作为“主线程”运行。 Java程序甚至不是直接的操作系统进程。 Java程序和操作系统之间没有直接的交互。没有直接将资源直接分配给Java程序,或者Java程序在进程表中不占任何位置。那么它应该将退出状态返回给谁呢?这就是为什么Java的 main 方法被设计为不返回 int 或退出状态的原因。
但是JVM是一个操作系统的进程,JVM可以以一定的退出状态终止。在Java.lang.Runtime.exit(int status)或System.exit(int status)的帮助下。