Java main()方法

你有没有试过之所以Java的主要方法publicstaticvoid?为什么叫它main?调用main()方法时,JVM内部会发生什么?主要方法目的是什么?让我们找出答案。

目录

1。 Java主要方法语法
2.为什么主要方法是公共的?
3.为什么主要方法是静态的?
4.为什么主要方法无效?
5.为什么名字叫main?
6.调用main方法在内部会发生什么?
7。 java.c中的main()方法本机代码
8.我们是否始终需要main方法来运行Java程序?
9.总结

1。 Java主要方法语法

首先提醒一下Java中main方法语法

public class Main 
{
    public static void main(String[] args) 
    {
        System.out.println("Hello World !!");
    }
}

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

最大的问题,也许也是最困难的。我尽力在我能获得的所有良好学习材料中找到找到此问题的一个很好的理由,但没有任何证据被证明是足够的。因此,我的分析(与许多其他方法一样)说:main方法是公共的,因此可以在任何地方以及可能希望使用它启动应用程序的每个对象中访问它。在这里,我并不是说JDK / JRE具有类似的原因,因为java.exejavaw.exe(对于Windows)使用Java本机接口(JNI)对invoke方法的调用,因此无论使用哪种访问修饰符,他们都可以以任何一种方式调用它。

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

请注意,如果不使用main()method public,则不会发生编译错误。您将出现运行时错误,因为main()不存在匹配置方法法。请记住,整个语法应匹配执行main()方法。

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()method static,则不会发生编译错误。您将运行时错误

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主要方法无效?

为什么不应该无效?您是否从代码中调用过此方法?没有。这样就没有任何将值返回给实际调用此方法的JVM的用途。它根本不需要任何返回值。

应用程序唯一想与调用过程进行通信的是正常终止还是异常终止。使用已经可以做到  System.exit(int)。非零值表示异常终止,否则一切正常。

5.为什么名字叫main?

没有坚如磐石的理由。让我们假设,因为它已经在C和C ++语言中使用。因此,大多数开发人员已经对这个名称感到满意。否则,没有其他充分的理由。

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

Java主要方法目的是作为程序执行的起点。

运行时java.exe有几个Java本机接口(JNI)调用。这些调用将加载真正是JVM的DLL(是的- java.exe不是JVM)。JNI是我们在虚拟机世界和C,C ++等世界之间架起桥梁时所使用的工具。反之亦然。如果不使用JNI,就不可能真正使JVM运行。

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

这非常类似于使用Java反射时的操作,只是使用了令人困惑的命名本机函数调用。

编写自己的版本java.exe(源代码随JDK分发)并执行完全不同的操作是完全合法的。

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

下载并解压缩源jar并签出../launcher/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的方法,并且每个人都知道编写它的基本语法。但是,很少有人完全理解正确的推理及其工作方式。我仍在努力寻求更多的理解,如果发现更多有趣的事实,将更新这篇文章。

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

参考:StackOverflow

saigon has written 1445 articles

Leave a Reply