Javaの修飾子
Java言語は、次のカテゴリに分けられ、多くの修飾子を提供します。
- アクセス修飾子
- 非アクセス修飾子
修飾子は、通常の文の最前線に、クラス、メソッドや変数を定義するために使用されます。 次の例を通して説明するために:
public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] arguments) { // 方法体 }
アクセス制御修飾子
Javaは、あなたがクラス、変数、メソッド、およびコンストラクタへのアクセスを保護するために、アクセス制御文字を使用することができます。 Javaのは、4つの異なるアクセス権をサポートしています。
デフォルトでは、 デフォルトとしても知られ、同じパッケージ内部に見える、任意の修飾子を使用しないでください。
プライベート、 プライベート修飾子が指定されていると、同じクラス内で目に見えます。
すべてのクラスに見えるパブリック修飾子を指定するためには、があります。
protected修飾子に、保護された可視同じパッケージ内のすべてのクラスとサブクラスのため、ということを指定します。
デフォルトのアクセス修飾子 - 任意のキーワードを使用していません
同じパッケージ内のクラスのデフォルトのアクセス修飾子で宣言された変数やメソッドを使用して、表示されています。 変数は暗黙のうちのpublic static finalとして宣言されているインターフェイス、およびインターフェイス公共のデフォルトのアクセス方法。
例:
次の例では、変数やメソッド内のステートメントは、任意の修飾子を使用することはできません。
String version = "1.5.1"; boolean processOrder() { return true; }
プライベートアクセス修飾子の-private
プライベートアクセス修飾子は、それがプライベートメソッド、変数として宣言され、アクセスの最も厳しいレベルです、とのみアクセスすることができるクラスのコンストラクタに属し、クラスとインタフェースは、プライベート宣言することはできません。
プライベートアクセスタイプとして宣言された変数は、クラスのパブリックgetterメソッドを介してクラス外部からアクセスすることができます。
クラスの背後にある保護クラスの実装の詳細およびデータのために主に使用されるプライベートアクセス修飾子。
以下のクラスは、プライベートアクセス修飾子を使用します。
public class Logger { private String format; public String getFormat() { return this.format; } public void setFormat(String format) { this.format = format; } }
例は、Loggerクラス形式の変数はプライベート変数なので、他のクラスは、直接変数の値を取得および設定することはできません。 他のクラス変数を操作することができるようにするために2つのパブリックメソッドを定義:getFormatの()(戻り値の形式)とのsetFormat(文字列)(形式の設定を)
パブリックアクセス修飾子-public
それは公共のクラス、メソッド、コンストラクタとして宣言され、およびインタフェースは、アクセスの他のタイプにすることができます。
別のパッケージ内のpublicクラスのいくつかの相互訪問する場合は、パブリック・クラスが存在する適切なパッケージをインポートする必要があります。 継承クラスなので、すべてのパブリックメソッドと変数のクラスは、そのサブクラスに継承することができます。
以下の機能は、パブリック・アクセス・コントロールを使用します。
public static void main(String[] arguments) { // ... }
メインJavaプログラム()メソッドはpublicに設定されている必要があり、そうでない場合は、Javaインタプリタは、クラスを実行することはできません。
保護されたアクセス修飾子で保護されました
同じパッケージで保護された変数、メソッドとコンストラクタは、アクセスの任意の他のタイプとすることができ、異なるパッケージのサブクラスにアクセスすることができるように宣言されています。
保護されたアクセス修飾子は、クラスおよびインタフェース、メソッド、メンバ変数を変更することはできません保護されたとして宣言することができますが、インターフェイスのメンバ変数とメンバメソッドは、保護宣言することはできません。
私たちはこれらのメソッドや変数を使用して、関係のないクラスを保護することができるように、サブクラスがアクセスできる修飾子は、保護されたメソッドと変数を宣言されています。
次の親クラスはサブクラスは親クラスのopenSpeaker()メソッドをオーバーライドし、保護されたアクセス修飾子を使用しています。
class AudioPlayer { protected boolean openSpeaker(Speaker sp) { // 实现细节 } } class StreamingAudioPlayer { boolean openSpeaker(Speaker sp) { // 实现细节 } }
openSpeaker()メソッドがprivateとして宣言されている場合は、AudioPlayerクラスに加えて、メソッドにアクセスすることはできません。 openSpeaker()はpublicとして宣言されている場合は、すべてのクラスは、メソッドにアクセスすることができます。 私たちはクラスのサブクラスへのプロセスが見えるようにしたい場合は保護され、その後、方法が宣言されています。
アクセス制御と継承
ルール継承し、次の方法に注意してください。
サブクラス内のパブリックメソッドとして宣言された親クラスは、パブリックでなければなりません。
親クラスは、サブクラスでメソッドを保護または保護されたとして宣言として宣言され、いずれかのパブリックとして宣言しました。 あなたはプライベート宣言することはできません。
プライベートメソッドとして宣言された親クラスを継承することはできません。
非アクセス修飾子
他の機能の数を達成するために、Javaは、非アクセス修飾子の数を提供します。
static修飾子は、クラスメソッドおよびクラス変数を作成するために使用されます。
final修飾子、クラス、メソッドや変数を飾るために使用され、最終的に修正されたクラスは継承できません、クラスの修正方法は、再定義継承された変数が一定の修正、変更することはできませんすることはできません。
abstract修飾子は、抽象クラスと抽象メソッドを作成するために使用されます。
主にプログラミング・スレッドに、同期化され、揮発性の修飾子。
static修飾子
静的変数:
staticキーワードは、オブジェクトの独立した静的変数を宣言するために使用され、関係なく、クラスがインスタンス化されるオブジェクトの数、それは静的変数の一つのコピーのみではありません。 静的変数は、クラス変数として知られています。 ローカル変数は静的変数として宣言することはできません。
静的メソッド:
staticキーワードは、オブジェクトを宣言するために使用される静的メソッドとは無関係です。 静的メソッドは、非静的変数のクラスを使用することはできません。 静的メソッドは、パラメータ・リストからデータを取得し、そのデータを算出します。
クラス変数やメソッドへのアクセスは、直接classname.variablenameとアクセスのclassname.methodname使用することができます。
以下の例では、静的な修飾子は、クラスメソッドおよびクラス変数を作成するために使用されます。
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修飾子は通常、static修飾子クラスの定数を作成するために一緒に使用されます。
例:
public class Test{ final int value = 10; // 下面是声明常量的实例 public static final int BOXWIDTH = 6; static final String TITLE = "Manager"; public void changeValue(){ value = 12; //将输出一个错误 } }
最終的な方法
最終的なクラスメソッドは、サブクラスによって継承されますが、サブクラスを変更することはできません。
この方法の主な目的は、この方法の最終的な宣言は、変更されないようにするためです。
最終宣言修飾方法を使用して、以下に示すように。
public class Test{ public final void changeName(){ // 方法体 } }
最終的なカテゴリ
最終的なクラスは継承できません、何のクラスはfinalクラスの特性のいずれかを継承することはできません。
例:
public final class Test { // 类体 }
abstract修飾子
抽象クラス:
抽象クラスは、オブジェクトをインスタンス化するために使用することができない、文の唯一の目的は、このクラスの将来の拡張のための抽象クラスです。
クラスは、抽象的で、最終的な変更することはできません。 クラスは抽象メソッドが含まれている場合は、クラスが、そうでない場合は、抽象クラスとしてコンパイラエラーを宣言する必要があります。
抽象クラスは、抽象メソッドと非抽象メソッドが含まれていてもよいです。
例:
abstract class Caravan{ private double price; private String model; private String year; public abstract void goFast(); //抽象方法 public abstract void changeColor(); }
抽象法
いいえ方法は、抽象メソッドの実装、サブクラスによって提供される方法の特定の実装ではありません。 抽象メソッドは最終的なものであり、厳密として宣言することはできません。
すべてのサブクラスは、サブクラスも抽象クラスでない限り、抽象クラスは、親クラスのすべての抽象メソッドを実装する必要があります継承します。
クラスが抽象メソッドの数が含まれている場合、クラスは抽象クラスとして宣言する必要があります。 抽象クラスは、抽象メソッドを含めることはできません。
抽象メソッドの宣言は、たとえば、セミコロンで終了します。パブリック抽象サンプルを();
例:
public abstract class SuperClass{ abstract void m(); //抽象方法 } class SubClass extends SuperClass{ //实现抽象方法 void m(){ ......... } }
シンクロナイズド修飾子
この方法は、同時に複数のスレッドのアクセスを宣言するためのキーワードを同期。 同期された改質剤は、4つのアクセス修飾子を適用することができます。
例:
public synchronized void showDetails(){ ....... }
transient修飾子
シリアライズされたオブジェクトは、その特定の変数をスキップするように一時的なインスタンス変数、Java仮想マシン(JVM)によって修正含まれています。
修飾子は、データ型クラスと変数を前処理するための変数文の定義に含まれています。
例:
public transient int limit = 55; // will not persist public int b; // will persist
揮発性修飾子
揮発性の修正されたメンバ変数は、それがスレッドにアクセスされるたびに、共有メモリからのメンバ変数の値を再読み込みすることを余儀なくされています。 また、メンバ変数の変更は、スレッドが共有メモリに書き戻す値を変更することを余儀なくされたとき。 任意の時点で、2つの異なるスレッドが常にメンバ変数の同じ値が表示されるように。
volatileオブジェクトの参照がnullの場合もあります。
例:
public class MyRunnable implements Runnable { private volatile boolean active; public void run() { active = true; while (active) // 第一行 { // 代码 } } public void stop() { active = false; // 第二行 } }
通常の状況下では、スレッドは、呼び出しは()メソッドを停止し、別のスレッドで(Runnableを開いたスレッドで)run()メソッドを呼び出します。 アクティブサイクルがfalseの場合、バッファの最初の行のアクティブな値は、2行目で、使用されている場合は停止しません。
しかし、上記のコードは、我々が変更された揮発性の積極的な使用するため、サイクルが停止します。