1

我读到了我在下面提到的对象块:

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
4

4 回答 4

6

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

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

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

于 2012-08-15T13:10:20.497 回答
3

根据 Java 语言规范,静态块将在类加载器加载和初始化时执行。至于初始化块,它们将在类实例化时执行。

请参阅Java 语言规范 (1.6) 中的静态初始化程序和实例初始化程序部分

于 2012-08-15T13:09:47.847 回答
1

事件顺序

  • 类被初始化,打印hello from Static
  • 调用main方法,打印hello from main
  • 对象被构造,打印This is my object block
于 2012-08-15T13:10:12.387 回答
0

每当类加载到 JVM 中时,都会执行静态块。而对象块或构造器块将在您创建所述对象的实例时运行。

这篇文章很好地描述了这些差异: http ://www.jusfortechies.com/java/core-java/static-blocks.php

于 2012-08-15T13:10:02.447 回答