Javaオブジェクト作成時の読み込み順序(静的メソッド、メンバーメソッド、構築メソッドなど)

オブジェクトが作成されるときのコードのロード順序は、静的コード->非静的コード->構築方法です。

親クラスが継承されている場合、ロードシーケンスは次のようになります。親クラスの静的コード->子クラスの静的コード->親クラス内の非静的コード->親クラスの構築メソッド->非静的コード子クラスの->サブクラスの構築メソッド。

その中には、静的コードには(静的メソッド、静的変数、静的コードブロックなど)、非静的コード(メンバーメソッド、メンバー変数、メンバーコードブロックなど)、同じ種類のコードが含まれ、最初にロードします。

オブジェクトが作成されたときのコードのロードシーケンス:次のとおり

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Parentclass Parentclass = new Parentclass();
    }

}
class Parentclass{
    
    
    static{
    
    
        System.out.println("父类静态代码块1");
    }
    static String tem=aa();

    static String aa(){
    
    
        System.out.println("父类的静态方法");
        return "";
    }
    public Parentclass(){
    
    
        System.out.println("父类的构造方法");
    }
    static{
    
    
        System.out.println("父类静态代码块2");
    }

    {
    
    
        System.out.println("父类非静态代码块1");
    }

    String temp = tt();
    String tt(){
    
    
        System.out.println("父类的成员方法");
        return "成员方法";
    }
    {
    
    
        System.out.println("父类非静态代码块2");
    }
}

実行の結果は次のとおりです。

父类静态代码块1
父类的静态方法
父类静态代码块2
父类非静态代码块1
父类的成员方法
父类非静态代码块2
父类的构造方法

親クラスが継承されている場合、ロードシーケンスは次のとおりです。

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Childernclass childernclass = new Childernclass();
    }

}
class Parentclass{
    
    
    static{
    
    
        System.out.println("父类静态代码块1");
    }
    static String tem=aa();

    static String aa(){
    
    
        System.out.println("父类的静态方法");
        return "";
    }
    public Parentclass(){
    
    
        System.out.println("父类的构造方法");
    }
    static{
    
    
        System.out.println("父类静态代码块2");
    }

    {
    
    
        System.out.println("父类非静态代码块1");
    }

    String temp = tt();
    String tt(){
    
    
        System.out.println("父类的成员方法");
        return "成员方法";
    }
    {
    
    
        System.out.println("父类非静态代码块2");
    }
}


class Childernclass extends Parentclass{
    
    
    static{
    
    
        System.out.println("子类静态代码块1");
    }
    static String tem=aa();

    static String aa(){
    
    
        System.out.println("子类的静态方法");
        return "";
    }
    public Childernclass(){
    
    
        System.out.println("子类的构造方法");
    }
    static{
    
    
        System.out.println("子类静态代码块2");
    }

    {
    
    
        System.out.println("子类非静态代码块1");
    }

    String temp = TT();
    String TT(){
    
    
        System.out.println("子类的成员方法");
        return "成员方法";
    }
    {
    
    
        System.out.println("子类非静态代码块2");
    }
}

父类静态代码块1
父类的静态方法
父类静态代码块2
子类静态代码块1
子类的静态方法
子类静态代码块2
父类非静态代码块1
父类的成员方法
父类非静态代码块2
父类的构造方法
子类非静态代码块1
子类的成员方法
子类非静态代码块2
子类的构造方法

概要:
クラスがロードされていない場合:
1。最初に親クラスの静的コードブロックと静的変数の初期化を実行します。静的コードブロックと静的変数の実行順序は、コード内の出現順序にのみ関連します。 。
2.サブクラスの静的コードブロックと静的変数の初期化を実行します。
3.親クラスのインスタンス変数の初期化を実行します
。4 。親クラスのコンストラクターを
実行します。5
。子クラスのインスタンス変数の初期化を実行します。6。子クラスのコンストラクターを実行します。

クラスがロードされている場合:
静的コードブロックと静的変数を繰り返し実行する必要はありません。クラスオブジェクトが作成されると、インスタンスに関連する変数の初期化メソッドと構築メソッドのみが実行されます。

おすすめ

転載: blog.csdn.net/qq_2662385590/article/details/110519381