java之main方法

你有没有试过去解释为什么Java主要方法publicstaticvoid?为什么它的名字是main?调用main()方法时JVM内部会发生什么?主方法目的是什么?我们来看看。

1. Java主要方法语法

首先提醒Java中main方法语法

Main.java

public class Main

{

    public static void main(String[] args)

    {

        System.out.println("Hello World !!");

    }

}

2.为什么Java主要方法是公开的?

这是个大问题,也许也是最困难的问题。我努力在所有良好的学习材料中找到一个很好的理由来解决这个问题,但是没有什么能够证明这一点。所以,我的分析说(和许多其他人一样):main方法是公共的,因此它可以在任何地方访问,也可以访问每个可能希望用它来启动应用程序的对象。在这里,我并不是说JDK / JRE有类似的原因,因为java.exe或者javaw.exe(对于windows)使用Java Native Interface(JNI)调用invoke方法,因此无论使用哪种访问修饰符,它们都可以调用它。

回答这个问题的另一个方法是另一个问题,为什么不公开?java中的所有方法和构造函数都有一些访问修饰符。main()方法也需要一个。它没有理由不应该是public,并且是任何其他修饰符(默认/受保护/私有)。

请注意,如果您不创建main()方法public,则不会出现编译错误。您将运行时错误,因为main()不存在匹配方法。请记住,整个语法应该与execute main()方法匹配。

Main.java

public class Main

{

    void static main(String[] args)

    {

        System.out.println("Hello World !!");

    }

}

节目输出:

安慰

Error: Main method not found in class Main, please define the main method as:

   public static void main(String[] args)

3.为什么Java main方法是静态的?

另一个大问题。要理解这一点,假设我们没有主要方法static。现在,要调用任何方法,您需要一个实例。对?

我们都知道,Java可以有重载的构造函数。现在,应该使用哪一个,以及重载构造函数的参数将来自何处。这些只是更难的问题,这有助于Java设计师下定决心并使用主要方法static

请注意,如果您不创建main()方法static,则不会出现编译错误。您将运行时错误

Main.java

public class Main

{

    public void main(String[] args)

    {

        System.out.println("Hello World !!");

    }

}

节目输出:

安慰

Error: Main method is not static in class main, please define the main method as:

   public static void main(String[] args)

4.为什么Java main方法无效?

为什么不能无效?你有没有从你的代码中调用这个方法?没有。然后没有使用向JVM返回任何值,JVM实际调用此方法。它根本不需要任何返回值。

应用程序唯一想要与调用进程通信的是正常或异常终止。这已经可以使用了  System.exit(int)。非零值意味着异常终止,否则一切都很好。

5.为什么这个名字是主要的?

没有坚如磐石的理由 让我们假设,因为它已经在使用C和C ++语言。所以,大多数开发人员已经习惯了这个名字。否则,没有其他充分的理由。

6.调用main方法时内部会发生什么?

Java中main方法目的是成为程序执行的起点。

运行时java.exe有几个Java本机接口(JNI)调用。这些调用加载了真正是JVM的DLL(这是正确的 - java.exe不是JVM)。当我们必须在虚拟机世界和C,C ++等世界之间架起桥梁时,JNI就是我们使用的工具。反过来也是如此。在不使用JNI的情况下实际运行JVM是不可能的。

基本上,java.exe是一个超级简单的C应用程序,它解析命令行,在JVM中创建一个新的String数组来保存这些参数,解析出你指定为包含的类名main()使用JNI调用来查找main()方法本身,然后调用main()方法,将新创建的字符串数组作为参数传入。

这非常非常类似于使用Java中的反射时所做的,它只是使用容易混淆的命名本机函数调用。

编写自己的版本java.exe(源代码随JDK一起发布)并让它完全不同,这对你来说是完全合法的。

7. java.c中的main()方法本机代码

下载并解压缩源jar并查看../launcher/java.c。它是这样的:

java.c

/*

* Get the application's main class.

*/

if (jarfile != 0) {

mainClassName = GetMainClassName(env, jarfile);

... ...

 

mainClass = LoadClass(env, classname);

if(mainClass == NULL) { /* exception occured */

... ...

 

/* Get the application's main method */

mainID = (*env)->GetStaticMethodID(env, mainClass, "main""([Ljava/lang/String;)V");

... ...

 

{/* Make sure the main method is public */

jint mods;

jmethodID mid;

jobject obj = (*env)->ToReflectedMethod(env, mainClass, mainID, JNI_TRUE);

... ...

 

/* Build argument array */

mainArgs = NewPlatformStringArray(env, argv, argc);

if (mainArgs == NULL) {

ReportExceptionDescription(env);

goto leave;

}

 

/* Invoke main method. */

(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

所以,在这里你可以看到当你用main方法调用java程序时会发生什么

8.我们总是需要main方法来运行java程序吗?

我不相信。我们有applet,我们不编写main方法。我仍然需要检查它们是如何执行的。如果您已经知道,请与我分享。

9.总结

main所有开发人员都使用Java的方法,每个人都知道编写它的基本语法。然而,很少有人完全理解正确的推理及其运作方式。我仍然试图找出更多的理解,如果发现更有趣的事实,我会更新这篇文章。

如果您有分享的内容,请在评论部分添加或发送邮件给我。我会在这篇文章中包含你的知识。

猜你喜欢

转载自blog.csdn.net/u010675669/article/details/86571084