変数 - java 初期化ブロック



Java静的初期化動作 (5)

Javaはクラスロード時に静的初期化を行います。 だから

public static final Hello h = new Hello();

Helloクラスがロードされたときに、 i = 5 、デフォルト値jのオブジェクトを作成します。

変数ijの両方を非静的メンバーにすると、どちらも静的オブジェクトhのデフォルト値になります

メインメソッドに新しいオブジェクトを作成した場合

Hello helloObj = new Hello();

それはあなたが望む結果をあなたに与えるでしょう。

https://src-bin.com

public class Hello {
        public static final Hello h = new Hello();
        static int i = 5;
        int j  = i;

        private void print() {
            System.out.println(i+" , "+j);

        }
        public static void main(String[] args) {

            h.print();
        }

    }

reasonがクラス内で最初に静的ロードを行い、iが初期化され、jが初期化されていない場合、このコード出力は5、0です。

public class Hello {
        public static final Hello h = new Hello();
        int i = 5;
        int j  = i;

        private void print() {
            System.out.println(i+" , "+j);

        }
        public static void main(String[] args) {

            h.print();
        }

    }

なぜ出力が5,5なのか その後、iとjが初期化されます。 その理由を説明してください。


Answer #1

Peter Lawreyの答えは正しいです、あなたの混乱はすべてが単一のクラスに属しているという事実から来ているかもしれません、そして名前はこんな感じです。

public class Program {

    public static Hello h = new Hello();

        public static void main(String [] args) {
            h.i = 5;
            h.print();
        }
    }

    class Hello {

        public static int i = 0;
        private int j = i;

        public void print() {
            System.out.println(i+", "+j);
        }
    }

Answer #2

Helloオブジェクトが作成された瞬間に、非静的変数ijが初期化されます。

public static final Hello h = new Hello();

質問の最初の部分では、 Peterがあなたに答えてくれました。 それを補完しましょう。 静的変数の順序を変更した場合

static int i = 5;
public static final Hello h = new Hello();
int j  = i;

5, 0なく5, 0


Answer #3

public static final Hello h = new Hello();を交換してみてくださいpublic static final Hello h = new Hello(); static int i = 5; 行。 最初にhelloオブジェクトを初期化し(when i = 0, uninitialized)iより(when i = 0, uninitialized)ます。 期待される動作を得るために最初にi初期化します。


Answer #4

静的ブロックは順番に実行されます。

最初にHelloオブジェクトを作成します。この時点ではi = 0が設定されていないためです。

これが終わって初めてi = 5

あなたは上から下に静的文を読む必要があります。





static