[英]We cant access non static instance from a static method, but can initiate a class. how?
我们无法从静态方法访问非静态实例。 但是main()方法是静态的,并且首先运行。 在main方法中任何其他类的初始化期间,它将调用构造函数。 那构造函数是静态的吗? JVM的基本流程是什么?
JVM调用main方法来运行超出项目范围的方法。
当JVM调用main
方法时,被调用的类不存在任何对象 。 因此,它必须具有静态方法才能允许此类。
在main方法中任何其他类的初始化期间,它将调用构造函数。
如果您要实例化 ,则可以。 创建一个类的实例,调用构造函数中,无论是new
的呼叫在由main
或其他地方。
如果您确实的意思是类初始化(通常会隐式发生),那么不会。 类的初始化不涉及类的构造函数。
例如
public class Example {
private static int foo = OtherClass.someMethod();
static {
// do something
}
public Example() {
// do something
}
}
类初始化为foo
和static
初始化程序块执行初始化程序,但不执行构造函数。 创建Example
的实例将调用Example()
构造函数。
那构造函数是静态的吗?
构造函数始终是静态的……从某种意义上说, new
不需要现有实例。
是的,我们无法从静态块访问非静态变量,因为非静态变量是实例变量,并且只能通过使用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虚拟机中。
图片来自: 了解JVM内部
JVM开始执行Java文件时,它将
首先编译 .java文件并将其转换为包含bytecode
即机器语言或汇编语言)的.class文件。 每次处理相同的字节码时, JVM都会与JIT (即时)编译器一起使用,以将字节码转换为本机代码 。
使用系统类加载器和BoostrapperClassLoader分别加载 .java文件和必要的软件包。
加载后,JVM将查找.class文件并存储所有信息,如变量,包,方法等,并将其保存到内存中并初始化所有字段变量 。
然后,JVM开始解释字节码并以人类可读的形式显示其结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.