Java-nonaccess-modifiers
Java-非アクセス修飾子
Javaは、他の多くの機能を実現するために、多くの非アクセス修飾子を提供します。
- クラスのメソッドと変数を作成するための_static_修飾子。
- クラス、メソッド、変数の実装を確定するための_final_修飾子。
- 抽象クラスとメソッドを作成するための_abstract_修飾子。
- スレッドに使用される_synchronized_および_volatile_修飾子。
静的修飾子
静的変数
_static_キーワードは、クラス用に作成されたインスタンスとは独立して存在する変数を作成するために使用されます。 クラスのインスタンスの数に関係なく、静的変数のコピーは1つだけ存在します。
静的変数はクラス変数とも呼ばれます。 ローカル変数は静的に宣言できません。
静的メソッド
staticキーワードは、クラス用に作成されたインスタンスとは独立して存在するメソッドを作成するために使用されます。
静的メソッドは、定義されているクラスのオブジェクトのインスタンス変数を使用しません。 静的メソッドは、パラメーターからすべてのデータを取得し、変数を参照せずにそれらのパラメーターから何かを計算します。
クラス名とそれに続くドットと変数またはメソッドの名前を使用して、クラス変数とメソッドにアクセスできます。
例
静的修飾子は、次の例のように、クラスのメソッドと変数を作成するために使用されます-
これは、次の結果を生成します-
出力
最終修正者
最終変数
最終変数は、一度だけ明示的に初期化できます。 finalと宣言された参照変数は、別のオブジェクトを参照するために再割り当てすることはできません。
ただし、オブジェクト内のデータは変更できます。 そのため、オブジェクトの状態は変更できますが、参照は変更できません。
変数では、定数をクラス変数にするために、_final_修飾子が_static_とともに使用されることがよくあります。
例
最終的な方法
最終メソッドをサブクラスでオーバーライドすることはできません。 前述のように、最終修飾子は、サブクラスでメソッドが変更されるのを防ぎます。
メソッドを最終的なものにする主な目的は、メソッドの内容を部外者が変更しないことです。
例
次の例のように、クラス宣言で_final_修飾子を使用してメソッドを宣言します-
最終クラス
_final_として宣言されているクラスを使用する主な目的は、クラスがサブクラス化されるのを防ぐことです。 クラスがfinalとしてマークされている場合、どのクラスもfinalクラスから機能を継承できません。
例
抽象修飾子
抽象クラス
抽象クラスはインスタンス化できません。 クラスが抽象として宣言されている場合、唯一の目的はクラスを拡張することです。
クラスは抽象クラスと最終クラスの両方にすることはできません(最終クラスは拡張できないため)。 クラスに抽象メソッドが含まれている場合、そのクラスは抽象として宣言する必要があります。 そうしないと、コンパイルエラーがスローされます。
抽象クラスには、抽象メソッドと通常のメソッドの両方を含めることができます。
例
抽象メソッド
抽象メソッドは、実装なしで宣言されたメソッドです。 メソッドの本体(実装)はサブクラスによって提供されます。 抽象メソッドは、決して最終的または厳密にはなり得ません。
抽象クラスを拡張するクラスは、サブクラスも抽象クラスでない限り、スーパークラスのすべての抽象メソッドを実装する必要があります。
クラスに1つ以上の抽象メソッドが含まれる場合、そのクラスは抽象として宣言する必要があります。 抽象クラスには、抽象メソッドを含める必要はありません。
抽象メソッドはセミコロンで終了します。 例:public abstract sample();
例
同期修飾子
一度に1つのスレッドのみがメソッドにアクセスできることを示すために使用されるsynchronizedキーワード。 synchronized修飾子は、4つのアクセスレベル修飾子のいずれかで適用できます。
例
一時的な修飾子
インスタンス変数は、それを含むオブジェクトをシリアル化するときにJVMが特定の変数をスキップすることを示すために一時的とマークされます。
この修飾子は、変数のクラスまたはデータ型の前に、変数を作成するステートメントに含まれます。
例
揮発性改質剤
volatile修飾子は、変数にアクセスするスレッドが常に変数の独自のプライベートコピーをメモリ内のマスターコピーとマージする必要があることをJVMに知らせるために使用されます。
揮発性変数にアクセスすると、メインメモリ内のキャッシュにコピーされた変数がすべて同期されます。 揮発性は、オブジェクト型またはプライベート型のインスタンス変数にのみ適用できます。 揮発性オブジェクト参照はnullにできます。
例
通常、run()は1つのスレッド(Runnableを使用して開始したスレッド)で呼び出され、stop()は別のスレッドから呼び出されます。 1行目でactiveのキャッシュ値が使用されている場合、2行目でactiveをfalseに設定してもループが停止しない場合があります。 _volatile_を使用したいときです。