2017-03-09 6 views
-3
public class StaticTest { 

    public static int k = 0; 
    public static StaticTest t1 = new StaticTest("t1"); 
    public static StaticTest t2 = new StaticTest("t2"); 
    public static int i = print("i"); 
    public static int n = 99; 
    public int j = print("j"); 

    { 
     print("构造块"); 
    } 

    static { 
     print("静态块"); 
    } 

    public StaticTest(String str) { 
     System.out.println((++k) + ":" + str + " i=" + i + " n=" + n + " this:" + this); 
     ++n; 
     ++i; 
    } 

    public static int print(String str) { 
     System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); 
     ++i; 
     return ++n; 
    } 

    public static void main(String[] args) { 
     new StaticTest("init"); 
    } 
} 

コードの静的ブロックを呼び出すために、ソースコードを必要としない、私は>>静的変数である、コードの静的ブロックをクラスのロード順序を知っていました私を混乱.what >​​>メンバ変数>>コード>>地殻方法の地殻ブロックであることが確認された場合なぜ負荷の静的変数のこのタイプは、上記のように

パブリック静的StaticTestさt1 =新しいStaticTest( "T1")。走っていないが、

、コードの静的ブロック(

が静的​​{ プリント( "静态块")})理由、実行

public int j = print( "j");

?それに何が起こったのですか?あなたに何か教えていただければ幸いです。

+0

静的変数が初期化されてライン9を与える1つの以上のオブジェクトを作成、呼び出されます。何が起こると思いますか? – Kayaman

+1

このコードを簡略化して具体的に実証しようとしているものを見て、見ている正確な出力を指定できますか? – David

+0

ここに投稿した正確なコードが実際にコンパイルされていることは間違いありませんか? –

答えて

0

ここにはstatic callはありません。 new Object()「方法」はconstructorを呼び出し、決してstaticではありません。あなたのプログラムから

0

出力:

1:j i=0 n=0 
2:构造块 i=1 n=1 
3:t1 i=2 n=2 this:[email protected] 
4:j i=3 n=3 
5:构造块 i=4 n=4 
6:t2 i=5 n=5 this:[email protected] 
7:i i=6 n=6 
8:静态块 i=7 n=99 
9:j i=8 n=100 
10:构造块 i=9 n=101 
11:init i=10 n=102 this:[email protected] 

あなたはJavaはmainメソッドを呼び出す前に、上から、最初の静的な初期化を行う上で乗り出していることが正しいです。あなたはこの時点で

public static StaticTest t1 = new StaticTest("t1"); 

を行う際に物事が静的initializtionsが完了していない場合であっても、もう少し複雑になっている、t1インスタンスの作成が開始されます。私はこのように私のコードで動作するようなことに頼りにするつもりはないと思います。とにかくt1の構築には、jの初期化と非静的初期化子ブロック(print("构造块");)とコンストラクタの実行が含まれます。これにより、出力に1行目から3行目が生成されます。 t2の構成は、4行目から6行目を生成します。

スタティック初期化は、i(行7)、n、静的初期化子ブロック(行8)の順に続きます。コンストラクターが実行されるように、最後にmain()

は、今度はあなたに11

+0

ええ、私はあなたのポイントを得て、StaticTestのインスタンスで静的変数を作成すると、JVMがそのためのヒープに領域を割り当てることに気づきました。私の前提は、メンバ変数だけがスペース(静的変数とメソッド領域の割り当てられたスペースにある静的なコードのブロック)を割り当てられるということです。静的なコードブロックは** t1 **インスタンス化後には呼び出されません。 * public int j = print( "j")**は実行されましたか? –

+0

私はそれについて考えています:静的変数は、クラスがロードされるときに一度割り当てられます(おそらくそれについてもっと言われるでしょう)。インスタンス変数だけが 'new'で割り当てられます。そして、すでにコンパイル時にそれらに割り当てるスペースを決めています。 –

+0

静的メンバ変数に 'new'オブジェクトを割り当てることができます。何故なの? –

関連する問題