我们无法从静态方法访问非静态实例。但是main()方法是静态的并且首先运行。在main方法中的任何其他类的初始化期间,它将调用构造函数。这个构造函数是静态的吗? JVM的基本流程是什么?
答案 0 :(得分:4)
JVM调用 main 方法来运行项目范围之外的方法。
当JVM调用main
方法时,正在调用的类存在 no object 。所以它必须有静态方法才允许来自类。
答案 1 :(得分:1)
在main方法中的任何其他类的初始化期间,它将调用构造函数。
如果您的意思是 instantiation ,那么它会。创建类的实例会调用构造函数,无论new
调用是在main
还是在其他任何地方进行的。
如果你真的意味着类初始化(通常发生隐式),那么不,它不会。类的初始化不涉及类构造函数。
例如
public class Example {
private static int foo = OtherClass.someMethod();
static {
// do something
}
public Example() {
// do something
}
}
类初始化执行foo
和static
初始化程序块的初始化程序,但不执行构造函数。创建Example
的实例会调用Example()
构造函数。
那个构造函数是静态的吗?
构造函数始终是静态的......在new
不需要现有实例的意义上。
答案 2 :(得分:0)
是的,我们无法从静态块访问非静态变量,因为非静态变量是实例变量&只能通过使用new
运算符创建类对象或使用Class.newInstance()
之类的反射来访问。然而,静态变量是类级别&它的值对于每个对象都是不变的。这意味着无需创建类的对象来访问这些变量。您可以使用类名(不同的类)或直接(在同一个类中)访问静态变量,如: -
public class HelloWorld {
private static String message = "Hello";
public static void main(String[] args) {
System.out.println(message);
System.out.println(HelloWorld1.sayHello);
}
}
public class HelloWorld1 {
public static String sayHello = "Hello1";
}
main()方法:
public static void main(String[] args) {}
在Java中,main()方法是静态的&它是JVM的切入点。因为, main()方法不属于Java中的任何类。当我们在任何用户定义的类中定义main()
方法时,它将属于该类。 因为它是静态的&在同一个类中,不需要使用类名访问它。主要方法可直接用于JVM。
JVM的工作原理:
当需要执行任何Java类时, ClassLoader 就会出现。 Java类加载器是Java运行时环境的一部分,可以将Java类动态加载到Java虚拟机中。
图片取自: Understanding JVM Internals
当JVM开始执行Java文件时,它就是
首先编译 .java文件&将其转换为.class文件,其中包含bytecode
,即机器语言或汇编语言。每次处理相同的字节码时, JVM都可以与JIT (即时)编译器一起使用将字节代码转换为本机代码。
加载 .java文件&必要的软件包使用System Class Loader& BoostrapperClassLoader resp。
加载后,JVM将查看.class文件& 存储所有信息,如变量,包,方法等等。将它们保存到记忆中&初始化所有字段变量。
JVM然后开始解释字节码&以人类可读的形式显示结果。