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

ブロックは、クラスローダがクラスをロードするたびに実行されます (これは、JVM インスタンスごとに 1 回実行されるのが最も一般的ですが、複数のクラスローダがすべてクラスをロードするという非常にstatic奇妙な状況を作り出すことができると思います。これは初心者レベルの状況ではありません)。 、 けれど)。インスタンス初期化ブロックは、そのクラス (またはそのサブクラスの 1 つ) のインスタンスを作成するたびに実行されます。プログラムには次のことが必要です。

  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
  • 主なメソッドが呼び出され、印刷します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 に答える