初期化初期化クラスのインスタンス:顔の質問

コード:

public class Father {
    private int i = test();

    private static int j = method();


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

    public Father() {
        System.out.print("(2)");
    }

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

    public int test() {
        System.out.print("(4)");
        return 1;
    }

    private static int method() {
        System.out.print("(5)");
        return 1;
    }
}

public class Son extends Father {
    private int i = test();

    private static int j = method();


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

    public Son() {
        System.out.print("(7)");
    }

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

    public int test() {
        System.out.print("(9)");
        return 1;
    }

    private static int method() {
        System.out.print("(10)");
        return 1;
    }

    public static void main(String[] args) {
        Son son1 = new Son();
        System.out.println();
        Son son2 = new Son();
    }
}

結果:

(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)

分析:

などの操作の主な方法は、まず、クラスを初期化しますときにSonそれが継承されFatherたクラスが最初に父と子とそのクラスが初期化されますので、

初期クラス

親(5)(1)〜(10)のサブクラス(6):内部の静的クラス変数、静的コードブロック、出力を初期化します

初期化の例

  • 親クラスのメンバ変数が初期化される、ブロック、コンストラクタ、出力:(9)(3)(2)

  • サブクラスメンバ変数が初期化され、ブロック、コンストラクタ、出力:(9)(8)(7)

問題:

親クラス()メソッドが有効になりません、なぜ上記の試験(1)?

原因であるtest()サブクラスでオーバーライドし、ときに呼び出すtest()時に、暗黙的に存在しているthis()方法は、親クラスを呼び出すことは、実際にサブクラスでありますtest()

(2)親クラスのメソッドは、すべての場合において、このような次のような状況のように書き換えることがないであろう

  • final方法
  • staticメソッド
  • private他の方法は、サブクラスには表示されません

実行シーケンスの(3)との位置

静的コードブロックと交流の静的メンバ変数の場所ならば、あなたは結果が変わることがわかります、共感、相互の交流は非静的メンバ変数とコードブロックが発生します変わり、上から下へ順番に実行されます

要約:




おすすめ

転載: www.cnblogs.com/songjilong/p/12444456.html