2013-03-15 5 views
9

私の友人の一人が、最初に静的変数または静的ブロックをロードするかどうか尋ねました。最初に読み込まれる静的変数または静的ブロックはどれですか?

私の答えは静的変数を指しています。

そこで彼は私に二つの式を与え、
それらの間の最初の方程式

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
} 

O/P区別するために言った:0 90

第2式

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
    static { 
     System.out.println(Some.x); 
    } 
} 

O/P:90 90

バイトコードを逆コンパイルしようとしたところ、上記の両方の式で同じことがわかりました。 それらを区別するのに手伝ってください。 静的変数が初期化されると混乱します。

+3

スタティックスタッフは、クラス内で定義されている順番で順番に実行されます。 –

+0

バイトコードは同じですか?私は宣言が異なる順序で出現することを期待していたでしょうし、@Sudhanshuが指摘しているように、宣言の順序は重要です。 –

+0

@PatriciaShanahan ya両方の方程式のバイトコードは同じです。 – Hablu

答えて

1

静的変数と静的ブロックは、彼らが表示されている順序で実行されます。 すでにスタックオーバーフローにこれに関連するいくつかの質問があります... この1つはあなたのために良い答えを持っています。

ここで第1のO/P:0 JVMがクラスをロードするときstatic int x=90;

+0

ごみ。定数の折り畳みは、JVMではなくコンパイラによって行われます。 JVMは、静的変数初期化子とブロックを、ソースファイルに表示されるテキスト順に実行します。最初の変数ではなくブロックです。 – EJP

+0

編集、ご迷惑をおかけして申し訳ありません。 –

-1

静的変数が実行される静的変数初期化ステートメントの後に実行される静的ブロックのSystem.out.println(Some.x);ステートメントのように90、およびクラスがロードされますインスタンス化されているか、その静的メソッドが呼び出されているかを示します。

スタティックInitializerブロックは、クラスがインスタンス化される前、またはスタティックメソッドが呼び出される前に初期化され、スタティック変数が使用される前に初期化されます。私は、静的およびインスタンスの制御フローのための簡単な例を与えている

-1

は詰め:

あなたはAとB クラスAはクラスBおよびクラスBにまで及ぶ2 clasesは、mainメソッドを持っていると仮定します。CMDの両方のあなたのコマンドが正常にコンパイル後のようである:

今、ステップバイステップを参照してください何が起こるか
java B 

  • クラスAとBがロードされます
    1. 静的メンバとクラスのブロックAが特定され、 が順番に実行されます(クラスロード時に1回のみ)
    2. クラスBの静的メンバーとブロックが識別されて実行されます(ただし、1回のみ)授業の時読み込み中)
    3. メインメソッドが呼び出されます(クラスBにメインメソッドがない場合、クラスAのmainメソッドが呼び出されます)
    4. クラスAのオブジェクトを作成するとすぐに:allインスタンス メンバーの初期化及びインスタンスブロックの実行が クラスで行われる
    5. あなたはクラスBのオブジェクトを作成する場合(オブジェクトを作成するために使用される)は、クラスAのコンストラクタは
    6. を実行するすべてのインスタンス メンバーの初期化とインスタンスブロックの実行は、 クラスAで行われます。
    7. クラスAのコンストラクタ(デフォルトコンストラクタまたは任意の他のあなたがBのコンストラクタから呼び出された場合は) 、すべてのインスタンス メンバーの初期化とインスタンスのブロックの実行が クラスB

      で行われます

    8. を実行されます

    9. 及び(オブジェクトを作成 ために使用される)、クラスBのコンストラクタが実行されること

    注後:静的メンバとブロック実行クラスのオブジェクトを作成するたびに、インスタンスメンバーとインスタンスブロックが毎回実行されるのに対し、最初にクラスをロードする間には1回のみ実行されます。 私が間違っている場合は教えてください。

  • +0

    'クラスAはクラスB'に拡張されていますが、最悪の場合はあいまいであり、無意味です。 AがBを拡張することを意味するならば、あなたの答えの大半は間違っています。 – EJP

    +0

    あなたを得ることができませんでした、あなたのポイントを説明してください。 –

    +0

    私はできるとは思わない。すでに私には完全にはっきりしているようです。引用した陳述を明確にする必要があります。 – EJP

    関連する問題