📌  相关文章
📜  Java main() 方法 – public static void main(String[] args)

📅  最后修改于: 2022-05-13 01:55:42.176000             🧑  作者: Mango

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程序停止执行时才会被销毁。

Java main() 方法

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。我们会得到一个编译时错误:

Java

class GeeksforGeeks {
 
   public static int main(String[] args) {
 
       System.out.println("GeeksforGeeks");
 
       return 0;
   }
 
}

现在,即使我们自己明确地返回 0 或整数,从 int main 中。我们得到一个运行时错误。

说明:从 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)的帮助下。