class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量(其实这用对象更好能体同这一点,如专门写一个类的实例) //如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化 public String p_Field = "父类--变量"; // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } // 初始化块 { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 构造器 public Parent() { System.out.println("父类--构造器"); } } public class SubClass extends Parent { // 静态变量 public static String s_StaticField = "子类--静态变量"; // 变量 public String s_Field = "子类--变量"; // 静态初始化块 static { System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); } // 初始化块 { System.out.println(s_Field); System.out.println("子类--初始化块"); } // 构造器 public SubClass() { //super(); System.out.println("子类--构造器"); } // 程序入口 public static void main(String[] args) { System.out.println("*************in main***************"); new SubClass(); System.out.println("*************second subClass***************"); new SubClass(); } }
出力結果
親クラス-静的変数
親クラス-静的初期化ブロック
サブクラス-静的変数
サブクラス-静的初期化ブロック
*************** **メイン内******************
親クラス--変数
親クラス--初期化ブロック
親クラス--コンストラクター
サブクラス--変数
サブクラス--初期化ブロック
サブクラス--Constructor
******************2番目のサブクラス*******************
親クラス- -変数
親クラス--初期化ブロック
親クラス--コンストラクター
サブクラス--変数
サブクラス--初期化ブロック
サブクラス--コンストラクター
結果分析:
明らかに、メインメソッドをロードした後、静的変数は親クラスまたはサブクラスのすべてが実行され、その後に親クラスとサブクラスの通常の変数とコンストラクターが存在します。これは、サブクラスのオブジェクトを作成する場合、このクラスには親クラスが必要であることがわかり、親クラスの .class をロードし、その通常の変数と初期化コード ブロックを順番に初期化し、最後にそのコンストラクターを使用すると、サブクラスの作業を開始できます。サブクラスの .class をロードし、サブクラスの作業を実行します。
さらに、Java では、サブクラスに super() というデフォルトのコンストラクターが存在します。デフォルトのコンストラクターしかない場合は、親クラスでコメントアウトして実験を行うことができます。サブクラスに super(argument) が追加されていない場合、Main メソッドの内容をすべてコメントアウトすると、
Parent のみが出力されることがわかります。クラス - 統計変数親クラス - 統計初期化ブロックサブクラス - 静的変数からのみの静的変数からのみ}それ以外の場合、静的変数静的変数
。理由? Java の親クラスとサブクラスのロード順序の詳細な説明については、PHP 中国語 Web サイトの関連記事に注目してください。