Java-nonaccess-modifiers
Java-非アクセス修飾子
Javaは、他の多くの機能を実現するために、多くの非アクセス修飾子を提供します。
- クラスのメソッドと変数を作成するための_static_修飾子。
- クラス、メソッド、変数の実装を確定するための_final_修飾子。
- 抽象クラスとメソッドを作成するための_abstract_修飾子。
- スレッドに使用される_synchronized_および_volatile_修飾子。
静的修飾子
静的変数
_static_キーワードは、クラス用に作成されたインスタンスとは独立して存在する変数を作成するために使用されます。 クラスのインスタンスの数に関係なく、静的変数のコピーは1つだけ存在します。
静的変数はクラス変数とも呼ばれます。 ローカル変数は静的に宣言できません。
静的メソッド
staticキーワードは、クラス用に作成されたインスタンスとは独立して存在するメソッドを作成するために使用されます。
静的メソッドは、定義されているクラスのオブジェクトのインスタンス変数を使用しません。 静的メソッドは、パラメーターからすべてのデータを取得し、変数を参照せずにそれらのパラメーターから何かを計算します。
クラス名とそれに続くドットと変数またはメソッドの名前を使用して、クラス変数とメソッドにアクセスできます。
例
静的修飾子は、次の例のように、クラスのメソッドと変数を作成するために使用されます-
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}
private static void addInstance() {
numInstances++;
}
InstanceCounter() {
InstanceCounter.addInstance();
}
public static void main(String[] arguments) {
System.out.println("Starting with " + InstanceCounter.getCount() + " instances");
for (int i = 0; i < 500; ++i) {
new InstanceCounter();
}
System.out.println("Created " + InstanceCounter.getCount() + " instances");
}
}
これは、次の結果を生成します-
出力
Started with 0 instances
Created 500 instances
最終修正者
最終変数
最終変数は、一度だけ明示的に初期化できます。 finalと宣言された参照変数は、別のオブジェクトを参照するために再割り当てすることはできません。
ただし、オブジェクト内のデータは変更できます。 そのため、オブジェクトの状態は変更できますが、参照は変更できません。
変数では、定数をクラス変数にするために、_final_修飾子が_static_とともに使用されることがよくあります。
例
public class Test {
final int value = 10;
//The following are examples of declaring constants:
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";
public void changeValue() {
value = 12; //will give an error
}
}
最終的な方法
最終メソッドをサブクラスでオーバーライドすることはできません。 前述のように、最終修飾子は、サブクラスでメソッドが変更されるのを防ぎます。
メソッドを最終的なものにする主な目的は、メソッドの内容を部外者が変更しないことです。
例
次の例のように、クラス宣言で_final_修飾子を使用してメソッドを宣言します-
public class Test {
public final void changeName() {
//body of method
}
}
最終クラス
_final_として宣言されているクラスを使用する主な目的は、クラスがサブクラス化されるのを防ぐことです。 クラスがfinalとしてマークされている場合、どのクラスもfinalクラスから機能を継承できません。
例
public final class Test {
//body of class
}
抽象修飾子
抽象クラス
抽象クラスはインスタンス化できません。 クラスが抽象として宣言されている場合、唯一の目的はクラスを拡張することです。
クラスは抽象クラスと最終クラスの両方にすることはできません(最終クラスは拡張できないため)。 クラスに抽象メソッドが含まれている場合、そのクラスは抽象として宣言する必要があります。 そうしないと、コンパイルエラーがスローされます。
抽象クラスには、抽象メソッドと通常のメソッドの両方を含めることができます。
例
abstract class Caravan {
private double price;
private String model;
private String year;
public abstract void goFast(); //an abstract method
public abstract void changeColor();
}
抽象メソッド
抽象メソッドは、実装なしで宣言されたメソッドです。 メソッドの本体(実装)はサブクラスによって提供されます。 抽象メソッドは、決して最終的または厳密にはなり得ません。
抽象クラスを拡張するクラスは、サブクラスも抽象クラスでない限り、スーパークラスのすべての抽象メソッドを実装する必要があります。
クラスに1つ以上の抽象メソッドが含まれる場合、そのクラスは抽象として宣言する必要があります。 抽象クラスには、抽象メソッドを含める必要はありません。
抽象メソッドはセミコロンで終了します。 例:public abstract sample();
例
public abstract class SuperClass {
abstract void m(); //abstract method
}
class SubClass extends SuperClass {
//implements the abstract method
void m() {
.........
}
}
同期修飾子
一度に1つのスレッドのみがメソッドにアクセスできることを示すために使用されるsynchronizedキーワード。 synchronized修飾子は、4つのアクセスレベル修飾子のいずれかで適用できます。
例
public synchronized void showDetails() {
.......
}
一時的な修飾子
インスタンス変数は、それを含むオブジェクトをシリアル化するときにJVMが特定の変数をスキップすることを示すために一時的とマークされます。
この修飾子は、変数のクラスまたはデータ型の前に、変数を作成するステートメントに含まれます。
例
public transient int limit = 55; //will not persist
public int b; //will persist
揮発性改質剤
volatile修飾子は、変数にアクセスするスレッドが常に変数の独自のプライベートコピーをメモリ内のマスターコピーとマージする必要があることをJVMに知らせるために使用されます。
揮発性変数にアクセスすると、メインメモリ内のキャッシュにコピーされた変数がすべて同期されます。 揮発性は、オブジェクト型またはプライベート型のインスタンス変数にのみ適用できます。 揮発性オブジェクト参照はnullにできます。
例
public class MyRunnable implements Runnable {
private volatile boolean active;
public void run() {
active = true;
while (active) { //line 1
//some code here
}
}
public void stop() {
active = false; //line 2
}
}
通常、run()は1つのスレッド(Runnableを使用して開始したスレッド)で呼び出され、stop()は別のスレッドから呼び出されます。 1行目でactiveのキャッシュ値が使用されている場合、2行目でactiveをfalseに設定してもループが停止しない場合があります。 _volatile_を使用したいときです。