1

次のコードの実行を理解できません。すべてがどのように連動するかを理解できるように、Java プログラムをたどりたいと思っています。Eclipse でブレークポイントをステップアップしましたが、その理由が説明されていません。コードは次のとおりです。

public class Sequence {
    public Sequence() {
        System.out.print("c ");
    }

    {
        System.out.print("y "); 
    }

    public static void main(String[] args) {
        new Sequence().go();
    }

    void go() {
        System.out.print("g ");
    }

    static {
        System.out.print("x ");
    }
}

コードへの出力はx y c g. 誰かがこれがなぜなのか説明できますか? プログラムのエントリ ポイントだと思っていたのですが、最初に実行さpublic static void mainれるように見えますか?static

4

6 に答える 6

3

staticブロックは開始前に実行されるためmainx印刷されます。

次に、メインに入り、呼び出します

new Sequence().go();

Sequenceコンストラクターを呼び出します。静的ブロックによると、コンストラクターが呼び出されるSequence(新しいSequenceオブジェクトが初期化される前) に、インスタンス ブロック (中かっこ内に記述されたブロック) が実行されるためy、出力されます。

次に、コンストラクター呼び出しが表示されますc

最後にgo()、新しく作成されたオブジェクトでメソッドが呼び出されるため、出力されますg

したがって、完全な出力は次のようになります

x y c g
于 2013-10-17T19:44:43.100 に答える
2

ここでは JLS が役に立ちます。正確には第 12 章です。

最初にstaticブロックが実行されます。これは、クラスが によってロードされるときに発生しClassLoaderます。

次にmain実行されます。これはJVMによって実行され、アプリケーションを開始します。

次に、 を呼び出すと、コンストラクターが実行されますnew Sequence()。コンパイラは、インスタンス初期化子 (中括弧内のビット) をコンストラクターの先頭にヤンクします (スーパークラス コンストラクターへの暗黙的な呼び出しの後)。したがって、中括弧内のビットが最初に実行され、次にコンストラクターのコードが実行されます。

最後にメソッドgo()が呼び出されます。

したがって、コードの出力はx y c g

于 2013-10-17T19:45:29.730 に答える
1

手順:

私。クラスがロードされると、静的ブロックが最初に実行されます。

ii. そのクラスのオブジェクトがインスタンス化されるたびに、初期化ブロックつまり

 {
   System.out.print("y ");
 }

 is executed(every time) and after that the time of constructor comes to be executed.

iii. オブジェクトの作成が終わると go() メソッドが実行されます。したがって、出力。

于 2015-02-08T06:05:50.220 に答える
1

最初の jvm は、アプリケーションの開始時に静的ブロックをロードします。したがって、静的ブロックが最初に実行されます。次に、main メソッドの実行が開始されます。

{
        System.out.print("y "); 
 }

はコンストラクターブロックであり、各コンストラクターにコピーされるため、クラスをインスタンス化するときに毎回呼び出されます。ここをクリック_

于 2013-10-17T20:03:44.220 に答える
1

あなたが使用したクラスで

//constructor
    public Sequence() {
        System.out.print("c ");
    }

    //instance init block
    {
        System.out.print("y "); 
    }

    //method
    void go() {
        System.out.print("g ");
    }

    //static init block
    static {
        System.out.print("x ");
    }

-> 初期化ブロックは出現順に実行されます。

-> クラスが最初にロードされるときに、静的な初期化ブロックが 1 回実行されます。

-> インスタンスの初期化ブロックは、クラス インスタンスが作成されるたびに実行されます。

-> インスタンスの初期化ブロックは、コンストラクターが super() を呼び出した後に実行されます。

→インスタンス生成後に実行されるコンストラクタ。

あなたが得たすべてのルールによると、期待されるx y c g 出力として

于 2013-10-17T19:57:10.040 に答える
1

Javaは、クラスのロード後、メソッドの前に静的ブロックを実行します。メインメソッドはすべてのプログラムのエントリポイントですが、メソッドであり、静的クラスの初期化です。

于 2013-10-17T19:57:39.887 に答える