静态块和对象块访问在java中

Pra*_*ati 1 java 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[]) {
    }
}
Run Code Online (Sandbox Code Playgroud)

这是程序的输出

Hello from Static
Run Code Online (Sandbox Code Playgroud)

但是当我创建类的对象时,对象块就会被执行.我无法理解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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

hello from Static
hello from main
This is my object block
Run Code Online (Sandbox Code Playgroud)

Han*_*Gay 6

static每当类加载器加载类时执行这些块(这通常是每个JVM实例执行一次,但我想你可能会创建一些非常奇怪的情况,你有多个类加载器都加载了类;这不是一个非常初学者级的情况,但是).每次创建该类(或其子类之一)的实例时,都会执行实例初始化程序块.您的计划要求:

  1. 该类由JVM加载; 这会触发静态初始化程序块(hello from Static).
  2. main执行静态方法
    1. A println执行(hello from main).
    2. 您创建一个实例Check.这会触发实例初始化程序,导致This is my object block.

GC与您询问的行为FTR没有任何关系.