Java了解Java逻辑上的主要方法

时间:2013-04-10 10:02:22

标签: java main

主要方法是Java应用程序中最重要的方法,它将启动应用程序作为入口点。在使用此方法之前发生的事情尚不清楚。请有人帮助我理解/澄清在使用该方法之前发生的事情,根据方法签名纠正我的感知,如下所示:

  • JVM创建至少一个将访问main方法的Object。此(假设)对象尝试根据API访问您的Java应用程序,这显然会将您绑定到已知方法签名public static void main (String[] args){}

    • public你不能限制JVM上的(假定的)单独对象访问你的对象,主要方法是单独完全看逻辑而不是API /签名吗?

      < / LI>
    • static根本没有对象启动和运行来创建任何其他对象实例(除了假设的JVM之外)来实例化或创建对象。静态修饰符意味着访问此方法的唯一可能性,因为它未绑定到实例,因此可以访问实例。再一次,这是逻辑,因为没有任何对象启动和运行(除了假设的JVM之外),还没有任何对象可以实例化任何其他对象吗?

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

这是接近和理解主要方法的正确和合理的方法吗?

4 个答案:

答案 0 :(得分:8)

你真正要问的是什么并不完全清楚,但JVM specification section 5.2至少涵盖了其中的一部分:

  

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

     

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

JLS section 12.1也有其他一些描述。

JVM直接调用main方法 - 它不需要创建新对象来执行此操作。虽然main方法本身必须是公共的,但它声明的类却没有。例如:

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

然后执行:

java 'Test$EntryPoint'

按预期打印“嗨”。

Test类以外的代码除了通过特权反射之外没有EntryPoint.main()访问权限 - 或者JVM显然能够直接访问。

答案 1 :(得分:2)

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

现在JVM启动器首先查看预主电源,按顺序调用它们(首先调用相应的静态块),然后查看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 ");        
    }

}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

public class Demo{ 

}

编译此代码时,因为它已成功编译为

$javac Demo.java

但是当它作为

执行时
$java Demo

然后它显示异常错误

  

在类Demo中找不到主要方法,请将main方法定义为:public static void main(String [] args)

因此编译器不负责检查是否存在main()方法。 JVM负责它。 JVM检查main()方法,原型为

public static void main(Strings[] args)
  
      
  1. 为什么JVM搜索main()方法?是否可以将main()方法更改为任何其他方法main_hero()
  2.   

JVM被指示从JVM内部查找main()方法。是的,可以将main()方法更改为main_hero()方法,但在JVM中,您必须指示搜索main_hero()方法。

JVM{ 

    public static void main(String[] args)  
}

JVM{ 

    public static void main_hero(String[] args)     
}
  
      
  1. 为何公开?
  2.   

JVM安装在C或D驱动器中,因此可以在任何公共场所使用。

  
      
  1. 为什么是静电?
  2.   

main()方法与对象无关,因此如果没有现有对象,JVM也必须调用此方法。 main方法无法与对象相关。

  
      
  1. 为什么无效?
  2.   

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