Java-修飾子-6

61963 ワード

Java修飾子
Java言語には多くの修飾子が用意されており、主に以下の2つに分類されています.
アクセス修飾子非アクセス修飾子修飾子は、通常、文の先頭に配置されるクラス、メソッド、または変数を定義するために使用されます.以下の例で説明します.
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つの異なるアクセス権限をサポートします.
デフォルトではdefaultとも呼ばれ、同じパッケージ内に表示され、修飾子は使用されません.
プライベートで、private修飾子で指定され、同じクラスで表示されます.
共通で、public修飾子で指定され、すべてのクラスに表示されます.
保護されたものはprotected修飾子で指定され、同じパッケージ内のクラスとすべてのサブクラスに表示されます.
デフォルトのアクセス修飾子-キーワードは使用されません
デフォルトのアクセス修飾子で宣言された変数とメソッドを使用して、同じパッケージ内のクラスが表示されます.インタフェースの変数はすべてpublic static finalと暗黙的に宣言され、インタフェースのメソッドのデフォルトではアクセス権限はpublicです.
例:
次の例に示すように、変数およびメソッドの宣言は、修飾子を使用しなくてもよい.
String version = "1.5.1";
boolean processOrder() {
   return true;
}

プライベートアクセス修飾子-private
プライベートアクセス修飾子は最も厳格なアクセスレベルであるため、privateとして宣言されたメソッド、変数、および構築メソッドは、所属するクラスのみにアクセスでき、クラスおよびインタフェースはprivateとして宣言できません.
プライベート・アクセス・タイプとして宣言された変数は、クラス内の共通のgetterメソッドでのみ外部クラスにアクセスできます.
Privateアクセス修飾子の使用は、主にクラスの実装の詳細を非表示にし、クラスのデータを保護するために使用されます.
次のクラスでは、プライベートアクセス修飾子を使用します.
public class Logger {
   private String format;
   public String getFormat() {
      return this.format;
   }
   public void setFormat(String format) {
      this.format = format;
   }
}

インスタンスでは、Loggerクラスのformat変数はプライベート変数であるため、他のクラスはその変数の値を直接取得して設定することはできません.他のクラスがこの変数を操作できるように、getFormat()とsetFormat(String)の2つのpublicメソッドが定義されています.formatの値を設定します.
パブリックアクセス修飾子-public
publicとして宣言されたクラス、メソッド、構築メソッド、およびインタフェースは、他のクラスによってアクセスできます.
相互にアクセスするいくつかのpublicクラスが不要なパケットに分散している場合は、対応するpublicクラスが存在するパケットをインポートする必要があります.クラスの継承性のため、クラスのすべての公有メソッドと変数はそのサブクラスに継承されます.
次の関数は、パブリックアクセス制御を使用します.
public static void main(String[] arguments) {
   // ...
}

Javaプログラムのmain()メソッドは共通に設定する必要があります.そうしないと、Java解釈器はクラスを実行できません.
保護されたアクセス修飾子-protected
protectedとして宣言された変数、メソッド、およびコンストラクタは、同じパケット内の他のクラスによっても、異なるパケット内のサブクラスによってもアクセスできます.
Protectedアクセス修飾子はクラスとインタフェースを修飾することはできません.メソッドとメンバー変数はprotectedとして宣言できますが、インタフェースのメンバー変数とメンバーメソッドはprotectedとして宣言できません.
サブクラスはProtected修飾子が宣言したメソッドと変数にアクセスし、関連しないクラスがこれらのメソッドと変数を使用することを保護します.
次の親はprotectedアクセス修飾子を使用し、子は親のopenSpeaker()メソッドを再ロードします.
class AudioPlayer {
   protected boolean openSpeaker(Speaker sp) {
      //     
   }
}

class StreamingAudioPlayer {
   boolean openSpeaker(Speaker sp) {
      //     
   }
}

OpenSpeaker()メソッドをprivateと宣言すると、AudioPlayer以外のクラスはメソッドにアクセスできません.OpenSpeaker()をpublicと宣言すると、すべてのクラスがこのメソッドにアクセスできます.メソッドが存在するクラスのサブクラスのみを表示する場合は、メソッドをprotectedとして宣言します.
アクセス制御と継承
次の方法で継承されるルールに注意してください.
親クラスでpublicとして宣言する方法は、子クラスでもpublicである必要があります.
親クラスでprotectedと宣言するメソッドは、サブクラスでprotectedと宣言するか、publicと宣言します.privateとして宣言できません.
親クラスでデフォルトの修飾子宣言の方法で、子クラスでprivateとして宣言できます.
親クラスでprivateと宣言されたメソッドは、継承できません.
非アクセス修飾子
Javaでは、他の機能を実装するために、非アクセス修飾子も多数提供されています.
static修飾子は、クラスメソッドとクラス変数を作成するために使用されます.
Final修飾子は、クラス、メソッド、変数を修飾するために使用され、final修飾のクラスは継承できません.修飾の方法は継承クラスによって再定義されません.修飾の変数は定数であり、修正できません.
抽象クラスと抽象メソッドを作成するAbstract修飾子.
Synchronizedとvolatile修飾子は、主にスレッドのプログラミングに使用されます.
Static修飾子
静的変数:Staticキーワードは、クラスがインスタンス化されたオブジェクトの数にかかわらず、オブジェクトから独立した静的変数を宣言するために使用されます.静的変数にはコピーが1つしかありません.静的変数もクラス変数となる.ローカル変数はstatic変数として宣言できます.
静的メソッド:Staticキーワードは、オブジェクトから独立した静的メソッドを宣言するために使用されます.静的メソッドでは、クラスの非静的変数は使用できません.静的メソッドは、パラメータリストからデータを取得し、これらのデータを計算します.
クラス変数およびメソッドへのアクセスは、classname.variablenameおよびclassname.methodnameを直接使用してアクセスできます.
次の例では、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変数:
Final変数は明示的に初期化でき、一度だけ初期化できます.finalとして宣言されたオブジェクトの参照は、異なるオブジェクトを指すことはできません.しかしfinalオブジェクトのデータは変更できます.つまりfinalオブジェクトの参照は変更できませんが、中の値は変更できます.
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; //       
  }
}

Finalメソッド
クラス内のFinalメソッドは布団クラスに継承できますが、布団クラスの修正はできません.
finalメソッドを宣言する主な目的は、メソッドの内容が変更されないようにすることです.
次のようにfinal修飾子を使用してメソッドを宣言します.
public class Test{
    public final void changeName(){
       //    
    }
}

Finalクラス
Finalクラスは継承できません.finalクラスの特性を継承できるクラスはありません.
例:
public final class Test {
   //   
}

Abstraact修飾子
抽象クラス:
抽象クラスはオブジェクトをインスタンス化するために使用できません.抽象クラスを宣言する唯一の目的は、将来クラスを拡張することです.
1つのクラスをabstractとfinalで同時に修飾することはできません.クラスに抽象メソッドが含まれている場合は、クラスを抽象クラスとして宣言する必要があります.そうしないと、コンパイルエラーが発生します.
抽象クラスには、抽象メソッドと非抽象メソッドが含まれます.
例:
abstract class Caravan{
   private double price;
   private String model;
   private String year;
   public abstract void goFast(); //    
   public abstract void changeColor();
}

抽象メソッド
抽象メソッドは、サブクラスによって提供される実装のないメソッドである.抽象メソッドはfinalとstrictとして宣言できません.
抽象クラスを継承する子クラスは、子クラスが抽象クラスでない限り、親クラスのすべての抽象メソッドを実装する必要があります.
クラスにいくつかの抽象メソッドが含まれている場合は、クラスを抽象クラスとして宣言する必要があります.抽象クラスには抽象メソッドを含まなくてもよい.
抽象メソッドの宣言はセミコロンで終わります.たとえば、public abstract sample()です.
例:
public abstract class SuperClass{
    abstract void m(); //    
}
 
class SubClass extends SuperClass{
     //      
      void m(){
          .........
      }
}

Synchronized修飾子
Synchronizedキーワード宣言のメソッドは、同じ時間に1つのスレッドしかアクセスできません.Synchronized修飾子は、4つのアクセス修飾子に適用できます.
例:
public synchronized void showDetails(){
.......
} 

Transient修飾子
シーケンス化されたオブジェクトにtransientによって修飾されたインスタンス変数が含まれている場合、java仮想マシン(JVM)はその特定の変数をスキップします.
この修飾子は、クラスと変数のデータ型を前処理するために変数を定義する文に含まれます.
例:
public transient int limit = 55;   // will not persist
public int b; // will persist

volatile修飾子
Volatile修飾メンバー変数は、スレッドによってアクセスされるたびに、共有メモリからメンバー変数の値を再読み込みするように強制されます.また、メンバー変数が変化すると、強制スレッドは変化値を共有メモリに戻す.これにより、2つの異なるスレッドは、常にメンバー変数の同じ値を表示します.volatileオブジェクト参照はnullである可能性があります.
例:
public class MyRunnable implements Runnable
{
    private volatile boolean active;
    public void run()
    {
        active = true;
        while (active) // line 1
        {
            //   
        }
    }
    public void stop()
    {
        active = false; // line 2
    }
}

一般に、run()メソッドは1つのスレッドで呼び出され、stop()メソッドは別のスレッドで呼び出される.ライン1のactiveがバッファにある値が使用される場合、ライン2のactiveをfalseに設定してもループは停止しない.