ホームページ >Java >&#&チュートリアル >Java修飾子の詳細な説明

Java修飾子の詳細な説明

高洛峰
高洛峰オリジナル
2017-01-24 15:27:161248ブラウズ

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 つの異なるアクセス権をサポートしています。

デフォルトはデフォルトとも呼ばれ、同じパッケージ内で表示され、修飾子を使用しません。

Private。private 修飾子で指定され、同じクラス内で表示されます。

共有、public 修飾子で指定され、すべてのクラスに表示されます。

Protected、protected 修飾子で指定され、同じパッケージ内のクラスとすべてのサブクラスに表示されます。

デフォルトのアクセス修飾子 - キーワードを使用しない

デフォルトのアクセス修飾子で宣言された変数とメソッドは、同じパッケージ内のクラスから参照できます。インターフェイス内の変数は暗黙的に public static Final として宣言され、インターフェイス内のメソッドのアクセス権はデフォルトで public になります。

例:

以下の例に示すように、変数とメソッドは修飾子なしで宣言できます。

String version = "1.5.1";
boolean processOrder() {
  return true;
}

プライベート アクセス修飾子 - プライベート

プライベート アクセス修飾子は最も制限的なアクセス レベルであるため、プライベートとして宣言されたメソッド、変数、およびコンストラクターには、それらが属するクラスのみがアクセスでき、クラスとインターフェイスをプライベートとして宣言することはできません。 。

プライベート アクセス型として宣言された変数には、クラス内のパブリック getter メソッドを介して外部クラスからのみアクセスできます。

Private アクセス修飾子の使用は、主にクラスの実装の詳細を隠し、クラスのデータを保護するために使用されます。

次のクラスはプライベート アクセス修飾子を使用します:

public class Logger {
  private String format;
  public String getFormat() {
   return this.format;
  }
  public void setFormat(String format) {
   this.format = format;
  }
}

この例では、Logger クラスのフォーマット変数はプライベート変数であるため、他のクラスは変数の値を直接取得および設定できません。他のクラスがこの変数を操作できるようにするために、2 つのパブリック メソッドが定義されています: getFormat() (format の値を返す) と setFormat(String) (format の値を設定する)

パブリック アクセス修飾子 - public

が宣言されていますpublic クラス、メソッド、コンストラクター、およびインターフェイスには、他のクラスからアクセスできます。

相互にアクセスする複数のパブリック クラスが異なるパッケージで配布されている場合は、対応するパブリック クラスが配置されているパッケージをインポートする必要があります。クラスの継承により、クラスのすべてのパブリック メソッドと変数はそのサブクラスに継承できます。

次の関数はパブリック アクセス制御を使用します:

public static void main(String[] arguments) {
  // ...
}

Java プログラムの main() メソッドは public に設定する必要があります。そうしないと、Java インタープリターはクラスを実行できません。

Protected アクセス修飾子 -protected

protected として宣言された変数、メソッド、およびコンストラクターは、同じパッケージ内の他のクラスからアクセスでき、また、異なるパッケージ内のサブクラスからもアクセスできます。

保護されたアクセス修飾子はクラスとインターフェイスを変更できません。メソッドとメンバー変数は保護されたものとして宣言できますが、インターフェイスのメンバー変数やメンバー メソッドは保護されたものとして宣言できません。

サブクラスは、Protected 修飾子によって宣言されたメソッドと変数にアクセスできるため、無関係なクラスがこれらのメソッドや変数を使用することはできません。

次の親クラスは protected アクセス修飾子を使用し、サブクラスは親クラスの openSpeaker() メソッドをオーバーロードします。

class AudioPlayer {
  protected boolean openSpeaker(Speaker sp) {
   // 实现细节
  }
}
class StreamingAudioPlayer {
  boolean openSpeaker(Speaker sp) {
   // 实现细节
  }
}

openSpeaker() メソッドが private として宣言されている場合、AudioPlayer 以外のクラスはこのメソッドにアクセスできません。 openSpeaker() が public として宣言されている場合、すべてのクラスがこのメソッドにアクセスできます。メソッドをそのクラスのサブクラスにのみ表示したい場合は、メソッドを保護済みとして宣言します。

アクセス制御と継承

メソッド継承に関する次の規則に注意してください:

親クラスで public として宣言されたメソッドは、子クラスでも public である必要があります。

親クラスで protected として宣言されたメソッドは、サブクラスでも protected または public として宣言されます。非公開と宣言することはできません。

親クラスでprivateとして宣言されたメソッドは継承できません。

非アクセス修飾子

他の機能を実装するために、Java は多くの非アクセス修飾子も提供します。

静的修飾子。クラスメソッドとクラス変数の作成に使用されます。

final 修飾子は、クラス、メソッド、変数を変更するために使用されます。final によって変更されたクラスは継承できません。変更されたメソッドは継承されたクラスによって再定義できません。また、変更された変数は定数であるため変更できません。

抽象修飾子。抽象クラスと抽象メソッドの作成に使用されます。

同期修飾子と揮発性修飾子は主にスレッド プログラミングに使用されます。

Static 修飾子

Static 変数:

Static キーワードは、オブジェクトから独立した静的変数を宣言するために使用されます。クラスがインスタンス化するオブジェクトの数に関係なく、静的変数のコピーは 1 つだけ存在します。 静的変数はクラス変数とも呼ばれます。ローカル変数は静的変数として宣言できます。

静的メソッド:

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");
  }
}


上記のインスタンスを実行した編集結果は次のとおりです:

0インスタンスから開始
500インスタンス作成

最終修飾子

最終変数:

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 {
  // 类体
}

Abstract修饰符

抽象类:

抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。

一个类不能同时被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关键字声明的方法同一时间只能被一个线程访问。Synchronized修饰符可以应用于四个访问修饰符。

实例:

public synchronized void showDetails(){
.......
}

Transient修饰符

序列化的对象包含被transient修饰的实例变量时,java虚拟机(JVM)跳过该特定的变量。

该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

实例:

public transient int limit = 55;  // will not persist
public int b; // will persist

volatile修饰符

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。一个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()方法,在另一个线程中调用stop()方法。如果line 1中的active位于缓冲区的值被使用,那么当把line 2中的active设置成false时,循环也不会停止。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持PHP中文网!

更多详解Java修饰符相关文章请关注PHP中文网!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。