Java理解Java逻辑的主要方法

Java理解Java逻辑的主要方法,java,main,Java,Main,main方法是Java应用程序中最重要的方法,它可以作为入口点启动应用程序。在使用这种方法之前发生了什么还不清楚。请有人根据以下方法签名纠正我对该方法的看法,帮助我理解/澄清使用该方法之前发生的情况: JVM至少创建一个将访问主方法的对象。这个(假定的)对象试图根据API访问Java应用程序,该API显然将您绑定到已知的方法签名publicstaticvoidmain(String[]args){} public您不能限制JVM上的(假定的)单独对象访问包含主要方法的对象,完全只查看逻辑,而

main方法是Java应用程序中最重要的方法,它可以作为入口点启动应用程序。在使用这种方法之前发生了什么还不清楚。请有人根据以下方法签名纠正我对该方法的看法,帮助我理解/澄清使用该方法之前发生的情况:


  • JVM至少创建一个将访问主方法的对象。这个(假定的)对象试图根据API访问Java应用程序,该API显然将您绑定到已知的方法签名
    publicstaticvoidmain(String[]args){}

    • public
      您不能限制JVM上的(假定的)单独对象访问包含主要方法的对象,完全只查看逻辑,而不查看API/签名

    • static
      根本没有任何对象启动并运行来创建任何其他对象实例(除了假定的JVM实例)来实例化或创建对象。静态修饰符意味着访问此方法的唯一可能性,因为它没有绑定到实例,因此可以在没有实例的情况下访问。同样,这是一种逻辑,因为如果没有任何对象启动并运行(除了假定的JVM对象),就不可能有任何对象启动以实例化任何其他对象

    • args
      跨语言和应用程序/可执行文件的标准,以提供自定义应用程序的能力|


这是一种正确且合乎逻辑的方法来处理和理解主要方法吗?

我们并不完全清楚您真正想问的是什么,但本文至少涵盖了其中的一些内容:

Java虚拟机通过使用引导类加载器(§5.3.1)创建初始类来启动,该类以依赖于实现的方式指定。然后,Java虚拟机链接初始类,对其进行初始化,并调用公共类方法void main(String[])。此方法的调用将驱动所有进一步的执行。执行构成主方法的Java虚拟机指令可能会导致链接(从而创建)其他类和接口,以及调用其他方法

在Java虚拟机的实现中,初始类可以作为命令行参数提供。或者,实现可以提供一个初始类,该类设置一个类加载器,该类加载器反过来加载一个应用程序。初始类的其他选择是可能的,只要它们与上一段中给出的规范一致

这本书还有一些其他的描述

JVM直接调用
main
方法-不需要创建新对象即可。尽管
main
方法本身必须是公共的,但声明它的类却不是。例如:

public class Test {
    private static class EntryPoint {        
        public static void main(String[] args) {
            System.out.println("Hi");
        }
    }
}
然后执行以下操作:

java 'Test$EntryPoint'
它按预期打印“Hi”


Test
类之外的任何代码都不能访问
EntryPoint.main()
,除非通过特权反射,或者JVM显然能够直接访问。

当您使用类似java someClassName的命令时,就会发生流动。 1.加载类someClassName并执行静态块(如果有) 在类加载期间,将创建一个表示类的对象类。 2.它使用类名调用main方法(它不会创建类的任何对象)
这就是为什么主方法是静态的。

java首先启动其核心—java.lang、类加载器、系统属性、运行时等,然后查看它必须做什么。在JVM初始化之前,该过程中没有“java”。这只是一个本地进程,因此我认为在这种情况发生之前用Java术语思考是错误的

现在JVM启动器将首先查看pre-main,按顺序调用它们(首先调用各自的静态块),然后查看main方法,如果有,调用该类静态块;最后调用main方法,将任何命令行参数传递给premain和main方法

简单测试:

public class Test {

    static{
            System.out.println("Hi static 1");        
    }

    public static void main(String[] args) {
        System.out.println("Hi main");
    }

    static{
        System.out.println("Hi static 2 better to have 1 static block per class but you can have N ");        
    }

}

比如说,文件
Demo.java
包含如下源代码

public class Demo{ 

}
当此代码按原样编译时,它将按原样成功编译

$javac Demo.java
但是当它被执行为

$java Demo
然后它显示一个异常错误

在类演示中找不到Main方法,请将Main方法定义为:public static void Main(字符串[]args)

所以编译器不负责检查
main()
方法是否存在。JVM对此负责。JVM检查prottoype为的
main()
方法

public static void main(Strings[] args)
  • 为什么JVM搜索
    main()
    方法?是否可以将
    main()
    方法更改为任何其他方法
    main\u hero()
  • JVM被指示从JVM内部查找
    main()
    方法。是的,可以将
    main()

    JVM{ 
    
        public static void main(String[] args)  
    }
    

  • 为什么公开
  • JVM安装在C或D驱动器中,以便在使用public的任何地方调用

  • 为什么是静态的
  • main()
    方法与对象无关,因此如果没有现有对象,JVM也必须调用此方法
    main
    方法与对象没有任何关联

  • 为什么无效

  • JVM将调用
    main()
    方法,但是如果
    main()
    方法返回,JVM可以用返回值做什么呢。所以它的意思是
    void

    “JVM至少创建一个对象来访问您的主方法。”-是什么让您得出这个结论的?(我相信它总是会创建一个字符串数组,但这不是一个“将访问主方法”的对象。)main是静态的,不需要访问任何对象。仅供参考
    JVM{ 
    
        public static void main_hero(String[] args)     
    }