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

时间:2012-08-15 13:04:41

标签: 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[]) {
    }
}

这是程序的输出

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 个答案:

答案 0 :(得分:6)

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

  1. 该类由JVM加载;这会触发静态初始化程序块(hello from Static)。
  2. 执行main静态方法
    1. 执行printlnhello from main)。
    2. 您创建了Check的实例。这会触发实例初始值设定项,从而导致This is my object block
  3. GC与您询问的行为没有任何关系,FTR。

答案 1 :(得分:3)

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

请参阅Java语言规范(1.6)中的Static InitializersInstance Initializers部分

答案 2 :(得分:1)

事件顺序

  • 初始化类,打印hello from Static
  • 调用main方法,打印hello from main
  • 构造对象,打印This is my object block

答案 3 :(得分:0)

只要将类加载到JVM中,就会执行静态块。 而在创建所述对象的实例时,将运行对象块或构造函数块。

本文非常好地描述了这些差异: http://www.jusfortechies.com/java/core-java/static-blocks.php