我读到了下面提到的对象块:
class Check {
static {
System.out.println("hello from Static");
}
//object block
{
System.out.println("This is my object block");
}
public static void main(String args[]) {
}
}
这是程序的输出
Hello from Static
但是当我创建类的对象时,对象块就会执行。 我无法理解jvm如何完成此过程。垃圾收集器是否有任何作用?
class Check {
static {
System.out.println("hello from Static");
}
//object block
{
System.out.println("This is my object block");
}
public static void main(String args[]) {
System.out.println("hello from main");
Check obj = new check();
}
}
这是输出:
hello from Static
hello from main
This is my object block
答案 0 :(得分:6)
每当类加载器加载类时都会执行static
块(这通常是每个JVM实例执行一次,但我想你可以创建一些非常奇怪的情况,你有多个所有加载类的类加载器;但这不是一个非常初学者级的情况。每次创建该类(或其子类之一)的实例时,都会执行实例初始化程序块。您的计划要求:
hello from Static
)。main
静态方法
println
(hello from main
)。Check
的实例。这会触发实例初始值设定项,从而导致This is my object block
。GC与您询问的行为没有任何关系,FTR。
答案 1 :(得分:3)
根据Java语言规范,当类加载并由类加载器初始化时,将执行静态块。至于初始化块,它们将在实例化类时执行。
请参阅Java语言规范(1.6)中的Static Initializers和Instance Initializers部分
答案 2 :(得分:1)
事件顺序
hello from Static
hello from main
This is my object block
答案 3 :(得分:0)
只要将类加载到JVM中,就会执行静态块。 而在创建所述对象的实例时,将运行对象块或构造函数块。
本文非常好地描述了这些差异: http://www.jusfortechies.com/java/core-java/static-blocks.php