クラスファイルのロードの順序
1.最初に、親クラスの静的変数と静的初期化ブロックをロードします(実行順序は順番に配置されます)
2.このクラスを実行する静的変数と静的初期化ブロックをリロードする
クラスが破壊されない限り、静的変数と静的初期化ブロックは1回のみ実行され、これら2つのステップはクラスの後続の操作ではさらに実行されません。
クラスインスタンス作成プロセス
クラスのインスタンスは、新しいメソッドが呼び出された場合にのみ作成されます。
1。上記のクラスファイルをロードする順序で(クラスがロードされている場合はこの手順をスキップします)
2。親クラスの非静的変数と非静的な初期化ブロック
3。親クラスの構築方法
4。このクラスの非静的変数と非静的な初期化ブロック
5。このクラスの建設方法
4.クラスインスタンスを破壊するときは、まずサブクラス部分を破壊し、次に親クラス部分を破壊します。
静的方法と非静的な方法の両方が受動的に呼ばれます
つまり、システムは自動的に呼び出して実行されません。したがって、ユーザーは呼び出されていないときにそれを実行しません。主な違いは、静的メソッドがクラス名(およびインスタンス化オブジェクトも実行できる)で直接呼び出すことができるということですが、非静的な方法はオブジェクトのインスタンス化後にのみ呼び出すことができます。
関連概念
静的キーワード:
メンバー(メンバー変数とメンバー関数)を変更するために使用される修飾子です
修正されたメンバーには、次の特性があります。
クラスがロードされるとロードされます(クラスがロードされるとすぐに、静的データはすぐにメモリにスペースをロードします)
クラスが消えるにつれて消え、最長のライフサイクルがあることを示します
オブジェクトの存在よりも優先的に(オブジェクトが消え、静的はまだそこにあります)
静的な存在最初に、オブジェクトは後で存在します
すべてのオブジェクトで共有されます
メモリスペースを保存します
メンバーが静的に変更された場合、オブジェクトによって呼び出されることに加えて、クラス名で直接呼び出すこともできます。
ライティング:クラス名。静的メンバー
使用に関するメモ
静的メソッドは静的メンバー(メソッドと変数)のみにアクセスできます
非静的な方法は、静的と非静的の両方にアクセスできます
これとスーパーキーワードは静的な方法で記述することはできません
オブジェクトよりも静的な優先順位があるため、これは静的な方法では表示されません
主な関数は静的です
publicStaticVoidMain(string [] args){}
静的を使用するのはいつですか?
静的変更の内容には、メンバー変数と関数が含まれているため、2つの側面から開始する必要があります。
静的変数(クラス変数)を定義するタイミング
共有データがオブジェクトに表示されると、データは静的に変更されます。オブジェクト内の一意のデータは、ヒープメモリに存在しないと定義する必要があります。
静的関数を定義するタイミング
非静的データ(オブジェクト固有のデータ)が内部的にアクセスされない場合、関数は静的として定義できます。
静的な長所と短所
利益:
1.オブジェクトの個別のスペースに共有データを保存し、スペースを節約します。各オブジェクトのコピーを1つ保存する必要はありません。
2。クラス名で直接呼び出すことができます
短所:
1.ライフサイクルが長すぎます
2。アクセス制限が発生します(静的アクセスのみ)
メモリ構造
Javaプログラムが実行されているとき、彼らはメモリにスペースを割り当てる必要があります。コンピューティング効率を改善するために、各領域には特定のデータ処理方法とメモリ管理方法があるため、空間のさまざまな領域が分割されています。
スタックメモリ
データが使用されるときにローカル変数を保存するために使用すると、占有されたスペースが自動的にリリースされます。
ヒープメモリ
アレイとオブジェクト(エンティティ)、新品を介して作成されたインスタンスはヒープメモリに保存されます(メンバー変数はオブジェクトの確立とともに確立され、オブジェクトが配置されているヒープメモリに存在します)。各エンティティにはメモリアドレス値があります(変数はアドレスで参照されます)。エンティティの変数には、デフォルトの初期化値があります。エンティティはもはや使用されなくなり、不確実な時間内にゴミコレクターによってリサイクルされます(ごみ収集メカニズム)
メソッドエリア、ローカルメソッドエリア、レジスタ
確認する
| 読み込み順序 | 親クラスの静的変数= 1 | 親クラスの非静的変数= 1 | サブクラス静的変数= 1 | サブクラスの非静的変数= 1 |
|---|---|---|---|---|
| [親クラスは、親クラスの静的方法を呼び出します] | parent.pstaticmethod(); | |||
| 親クラスの静的初期化ブロック1 | 2 | |||
| 親クラスの静的初期化ブロック2 | 3 | |||
| 親クラスの静的方法 | 4 | |||
| [サブクラスコールサブクラス静的メソッド] | child.cstaticMethod(); | |||
| サブクラス静的初期化ブロック1 | 5 | 2 | ||
| サブクラスの静的初期化ブロック2 | 6 | 3 | ||
| サブクラス静的メソッド | 7 | 4 | ||
| 【サブクラスのインスタンス化】 | 子c = new Child(); | |||
| 親クラスは、非静的な初期化ブロック1です | 8 | 2 | ||
| 親クラスの非静的初期化ブロック2 | 9 | 3 | ||
| 親クラスコンストラクター | 10 | 4 | ||
| サブクラス以外の初期化ブロック1 | 11 | 5 | 5 | 2 |
| サブクラスの非静的初期化ブロック2 | 12 | 6 | 6 | 3 |
| サブクラス建設方法 | 13 | 7 | 7 | 4 |
| 【親クラスはサブクラスオブジェクトをインスタンス化します】 | 親p = new Child(); | |||
| 親クラスは、非静的な初期化ブロック1です | 14 | 2 | ||
| 親クラスの非静的初期化ブロック2 | 15 | 3 | ||
| 親クラスコンストラクター | 16 | 4 | ||
| サブクラス以外の初期化ブロック1 | 17 | 5 | 8 | 2 |
| サブクラスの非静的初期化ブロック2 | 18 | 6 | 9 | 3 |
| サブクラス建設方法 | 19 | 7 | 10 | 4 |
| 読み込み順序 | 親クラスの静的変数= 1 | 親クラスの非静的変数= 1 | サブクラス静的変数= 1 | サブクラスの非静的変数= 1 |
|---|---|---|---|---|
| 【サブクラスのインスタンス化】 | 子c = new Child(); | |||
| 親クラスの静的初期化ブロック1 | 2 | |||
| 親クラスの静的初期化ブロック2 | 3 | |||
| サブクラス静的初期化ブロック1 | 4 | 2 | ||
| サブクラスの静的初期化ブロック2 | 5 | 3 | ||
| 親クラスは、非静的な初期化ブロック1です | 6 | 2 | ||
| 親クラスの非静的初期化ブロック2 | 7 | 3 | ||
| 親クラスコンストラクター | 8 | 4 | ||
| サブクラス以外の初期化ブロック1 | 9 | 5 | 4 | 2 |
| サブクラスの非静的初期化ブロック2 | 10 | 6 | 5 | 3 |
| サブクラス建設方法 | 11 | 7 | 6 | 4 |
| 【親クラスはサブクラスオブジェクトをインスタンス化します】 | 親p = new Child(); | |||
| 親クラスは、非静的な初期化ブロック1です | 12 | 2 | ||
| 親クラスの非静的初期化ブロック2 | 13 | 3 | ||
| 親クラスコンストラクター | 14 | 4 | ||
| サブクラス以外の初期化ブロック1 | 15 | 5 | 7 | 2 |
| サブクラスの非静的初期化ブロック2 | 16 | 6 | 8 | 3 |
| サブクラス建設方法 | 17 | 7 | 9 | 4 |
| [親クラスは、親クラスの静的方法を呼び出します] | parent.pstaticmethod(); | |||
| 親クラスの静的方法 | 18 | |||
| [サブクラスコールサブクラス静的メソッド] | child.cstaticMethod(); | |||
| サブクラス静的メソッド | 19 | 10 |
public class classtest {public static void main(string args []){system.out.println( "【サブクラスインスタンス化】|子c = new child();");子c = new Child(); System.out.println( "【プレミアムクラスインスタンスサブクラスオブジェクト】|親p = new child();");親p = new Child(); System.out.println( "[Premiumクラスは、親クラスStatic Method] | parent.pstaticmethod();"); parent.pstaticmethod(); System.out.println( "[サブクラスコールSubclass Static Method] | child.cstaticMethod();"); child.cstaticMethod(); }} public class classtest2 {public static void main(string args []){system.out.println( "[[指定]クラスコール親クラスstaticメソッド] | parent.pstaticmethod();"); parent.pstaticmethod(); system.out.println( "[サブクラスコールサブクラス静的メソッド] | child.cstaticmethod();"); child.cstaticMethod(); system.out.println( "[サブクラスインスタンス化] |子c = new child();");子c = new Child(); System.out.println( "【parent classは子クラスオブジェクトをインスタンス化します】|親p = new Child();");親p = new Child(); }} public class parent {//親クラス静的変数静的int m = 1; //親クラス非静的変数int n = 1; // staticステートメントブロック1 static {m ++; // J ++;親クラスの非静的変数は、静的なステートメントブロックsystem.out.println( "depreventクラス静的初期化ブロック1 |" + m)で使用できません。 } // staticステートメントブロック2 static {m ++; System.out.println( "Preadentクラス静的初期化ブロック2 |" + M); } // constructor public parent(){m ++; n ++; System.out.println( "Preadentクラスコンストラクター|" + M + "|" + n); } //非静的なステートメントブロック{m ++; n ++; System.out.println( "幹部の非静的初期化ブロック1 |" + m + "|" + n); } //非静的なステートメントブロック{m ++; n ++; System.out.println( ""司会クラスの非静的初期化ブロック2 | " + m +" | " + n); } // nonstaticメソッドpublic void pmethod(){m ++; n ++; System.out.println( "幹部の非静的方法|" + m + "|" + n);戻る; } // staticメソッドpublic static void pstaticmethod(){m ++; // j ++;親クラスの非静的変数は、静的方法system.out.println( "static method |" + m)で使用できません。戻る; } @Override Protected void finalize()throws throwsable {super.finalize(); System.out.println( "親クラスを破壊|"); }}パブリッククラスの子供は親を拡張します{// static static int i = 1; //非静的変数int j = 1; // staticステートメントブロック1 static {m ++; i ++; // J ++; Static Statement Block System.out.println( "Subclass Static Intiilization block 1" + "|" + M + "||" + i)では、staticの変数を使用できません。 } // staticステートメントブロック2 static {m ++; i ++; System.out.println( "サブクラス静的初期化ブロック2" + "|" + m + "||" + i); } // constructor public child(){m ++; n ++; i ++; J ++; System.out.println( "サブクラスコンストラクター" + "|" + m + "|" + n + "|" + i + "|" + j); } //非静的なステートメントブロック{m ++; n ++; i ++; J ++; System.out.println( "サブクラス非静的初期化ブロック1" + "|" + m + "|" + n + "|" + i + "|" + j); } //非静的なステートメントブロック{m ++; n ++; i ++; J ++; System.out.println( "サブクラス非静的初期化ブロック2" + "|" + m + "|" + n + "|" + i + "|" + j); } // nonstaticメソッドpublic void pmethod(){m ++; n ++; i ++; J ++; System.out.println( "サブクラスは非静的な方法を継承します" + "|" + m + "|" + n + "|" + i + "|" + j);戻る; } // staticメソッドpublic static void pstaticmethod(){//静的メソッドを継承できませんm ++; i ++; // J ++;静的な方法では、非定常変数を使用することはできません。 } // nonstaticメソッドpublic void cmethod(){m ++; n ++; i ++; J ++; System.out.println( "サブクラス非静的メソッド" + "|" + m + "|" + "|" + i + "|" + j);戻る; } // staticメソッドpublic static void cstaticmethod(){m ++; i ++; // J ++;静的メソッドSystem.out.println( "Subclass Static Method" + "|" + M + "||" + i)で非静的変数を使用することはできません。戻る; } @Override Protected void finalize()throws throwsable {super.finalize(); System.out.println( "Subclass |"を破壊する); }}要約します
上記は、Javaのクラス積載プロセスの包括的な分析に関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。質問がある場合は、いつでもメッセージを残すことができ、編集者はすべての人に時間内に返信します。あなたの貴重なコメントを楽しみにしています。