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つの異なるアクセス権をサポートしています。
- デフォルト(デフォルト、書き込みには何もあり):可視同じパッケージでは、任意の修飾子を使用しないでください。オブジェクトを使用する:クラス、インタフェース、変数、メソッド。
- プライベート:同じクラス内に見えます。使用すると、オブジェクト:変数とメソッドを。注:あなたは、クラス(外クラス)を変更することはできません
- パブリック:すべてのクラスに見えます。オブジェクトを使用する:クラス、インタフェース、変数、メソッド
- 保護:同じパッケージ内のすべてのクラスおよびサブクラスに見えます。使用すると、オブジェクト:変数とメソッドを。注:あなたは、クラス(外変更することはできませんクラス)。
修飾子 | 現在のクラス | 同一包内 | 子孫クラス(同じパッケージ) | (異なるパッケージでの)派生クラス | 他のパッケージ |
---|---|---|---|---|---|
public |
と | と | と | と | と |
protected |
と | と | と | Y / N | N |
default |
と | と | と | N | N |
private |
と | N | N | N | N |
第二に、デフォルトのアクセス修飾子は - キーワードを使用していません
使用変数とメソッドは、同じパッケージ内のクラスのデフォルトアクセス修飾子に表示されて宣言しました。変数は暗黙のうち最終のpublic staticとして宣言されているインタフェース、およびデフォルトのアクセス方式のインターフェイスはデフォルトでpublicです。
次の文に示す例では、変数とメソッドは、任意の修飾語なしで使用することができます。
String version = "1.5.1";
boolean processOrder() {
return true;
}
第三に、民間のアクセス修飾子-private
プライベートアクセス修飾子は、データ保護とクラスの背後にあるクラスの実装の詳細のために主に使用されています。
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
第四に、パブリックアクセス修飾子-public
公共のクラス、メソッド、コンストラクタとして宣言され、そしてインターフェースは、アクセスの任意の他のタイプであってもよいです。
public static void main(String[] arguments) {
// ...
}
メインのJavaプログラム()メソッドは、そうでない場合は、パブリックに設定する必要があり、Javaインタプリタは、クラスを実行することはできません。
第五に、非アクセス修飾子
クラス変数とクラスメソッドの修正のためにstatic修飾子。
クラス変数およびメソッドを変更するための最終的な変性剤、変性最終クラスが継承することができない、クラスの修飾方法を継承することができないが、修飾された変数の定数を再定義し、修正することができません。
abstract修飾子は、抽象クラスと抽象メソッドを作成するために使用されます。
主にスレッドをプログラムするため、同期やvolatile修飾子。
1、static修飾子
-
静的変数:
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");
}
}
---结果:
Starting with 0 instances
Created 500 instances
2、最終修飾子
最後の変数:
最終的には意味の後に「最後の最後の」を表し、変数の代入後、再割り当てすることはできません。変更され、最終的なインスタンス変数を明示的に初期値を指定する必要があります。
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 {
// 类体
}
3、abstract修飾子
抽象クラス:
抽象クラスは、オブジェクトをインスタンス化するために使用することはできません、抽象クラスの声明の唯一の目的は、将来の拡張のためのクラスです。
クラスは、抽象的で、最終的な変更することはできません。クラスは抽象メソッドが含まれている場合は、クラスがそれ以外の場合は、コンパイルエラーが発生します、抽象クラスとして宣言する必要があります。
抽象クラスは非抽象メソッドと抽象メソッドが含まれていてもよいです。
abstract class Caravan{
private double price;
private String model;
private String year;
public abstract void goFast(); //抽象方法
public abstract void changeColor();
}
抽象メソッド:
抽象ない方法は、実装方法、サブクラスによって提供される方法の特定の実装です。
抽象メソッドは、finalまたはstaticとして宣言することはできません。
サブクラスでも抽象クラスでない限り、親クラスのすべての抽象クラスの抽象メソッドの任意のサブクラスの継承は、実装する必要があります。
クラスは抽象メソッドの数が含まれている場合、クラスは抽象クラスとして宣言する必要があります。抽象クラスは、抽象メソッドを含めることはできません。
抽象メソッド宣言は、例えば、セミコロンで終了:パブリック抽象サンプルを() 。
public abstract class SuperClass{
abstract void m(); //抽象方法
}
class SubClass extends SuperClass{
//实现抽象方法
void m(){
.........
}
}
4、同期修飾子
同じ時間を宣言するためのsynchronizedキーワードの方法は、一つのスレッドのみアクセスすることができます。同期修飾子は、4つのアクセス修飾子を適用することができます。
public synchronized void showDetails(){
.......
}
5、transient修飾子
シリアライズされたオブジェクトは、インスタンス変数が含まれている場合は、その特定の変数をスキップする過渡修正、Java仮想マシン(JVM)です。
修飾子は、ステートメントに含まれている前処理変数のデータ・タイプの変数、およびクラスを定義します。
public transient int limit = 55; // 不会持久化
public int b; // 持久化
6、volatile修飾子
揮発性修飾メンバ変数、それがアクセスされるたびに、スレッドは、共有メモリからメンバ変数の再読み取り値に強制されます。また、変数の変化のメンバーは、スレッドは、共有メモリに書き戻された値を変更することを余儀なくされたとき。だから、任意の時点で、2つの異なるスレッドが常にメンバ変数の同じ値を参照してくださいということ。
揮発性オブジェクト参照をnullにすることもできます。
public class MyRunnable implements Runnable
{
private volatile boolean active;
public void run()
{
active = true;
while (active) // 第一行
{
// 代码
}
}
public void stop()
{
active = false; // 第二行
}
}
通常の状況下では、スレッドが別のスレッドの呼び出し停止中()メソッド、(オープン実行可能スレッドで)run()メソッドを呼び出します。場合の最初のラインバッファにおける活性値が使用され、その後、第2の行活性がfalseの場合サイクルは停止しません。
しかし、上記のコードは、私たちは、活性揮発性の変更を使用するので、サイクルが停止します。