Javaの静的コード・ブロック、およびコードブロックの実行順序のコンストラクタ

以下の手順に従って分析

親クラスの定義

package sas.LearnJava;

public class ExcuteOrderTest {
    {
        System.out.println("我是在父类开始的普通代码块!");
    }

    public ExcuteOrderTest() {
        System.out.println("我是父类的无参构造函数!");
    }

    public void showSomething() {
        System.out.println("我是父类中定义的方法!");
    }

    static {
        System.out.println("我是在父类中静态的代码块!");
    }
}

サブクラスを定義します

package sas.LearnJava;

public class SubExcuteOrderTest extends ExcuteOrderTest {
    static {
        System.out.println("我是在子类中的静态代码块!");
    }

    public SubExcuteOrderTest() {
        System.out.println("我是子类的无参构造函数!");
    }
    @Override
    public void showSomething() {
        System.out.println("我是子类中定义的方法!");
    }

    public static void test() {
        System.out.println("子类中的静态测试方法");
    }

    {
        System.out.println("我是在子类结束的普通代码块!");
    }
}

デモを使用して、書き込みのサブクラス

package sas.LearnJava;

public class ExcuteOrderDemo {
    public static void main(String[] args) {
        System.out.println("创建第一个对象");
        SubExcuteOrderTest subExcuteOrderTest1 = new SubExcuteOrderTest();
        System.out.println("创建第二个对象");
        SubExcuteOrderTest subExcuteOrderTest2 = new SubExcuteOrderTest();
    }
}
创建第一个对象
我是在父类中静态的代码块!
我是在子类中的静态代码块!
我是在父类开始的普通代码块!
我是父类的无参构造函数!
我是在子类结束的普通代码块!
我是子类的无参构造函数!
创建第二个对象
我是在父类开始的普通代码块!
我是父类的无参构造函数!
我是在子类结束的普通代码块!
我是子类的无参构造函数!

結果から、いくつかを実行することができます:

  • あなたがオブジェクトを作成すると、クラスは親クラスのコードブロックと引数なしのデフォルトコンストラクタで実行した後、コードブロックとそのコンストラクタを実行しています
  • 実行静的コードブロックは、プログラム内の位置に関わらず、コードブロック、及び非静的コンストラクタの順序を決定し、そして
  • コードのサブクラスの静的ブロックは、コード実行の親の静的ブロックの後に実行されます
  • 静的コード・ブロック1回だけ実行され、コードの通常のブロックは再初期化とオブジェクトを作成します
package sas.LearnJava;

public class ExcuteOrderDemo {
    public static void main(String[] args) {
        SubExcuteOrderTest.test();
    }
}
我是在父类中静态的代码块!
我是在子类中的静态代码块!
子类中的静态测试方法

オブジェクトを作成しない場合、直接クラスの静的メソッドを呼び出し、静的コードブロックは、親クラスとサブクラスを実行します

おすすめ

転載: www.cnblogs.com/sasworld/p/11515616.html