Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - 非訪問修飾符



Java 提供了許多非訪問修飾符來實現許多其他功能。

  • 用於建立類方法和變數的 static 修飾符。

  • 用於完成類、方法和變數實現的 final 修飾符。

  • 用於建立抽象類和方法的 abstract 修飾符。

  • 用於執行緒的 synchronizedvolatile 修飾符。

靜態修飾符

靜態變數

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

輸出

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 修飾符阻止方法在子類中被修改。

使方法成為最終的主要目的是方法的內容不應被任何外部人員更改。

示例

您可以在類宣告中使用 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();
}

抽象方法

抽象方法是一種沒有實現的宣告方法。方法體(實現)由子類提供。抽象方法永遠不能是最終的或嚴格的。

任何擴充套件抽象類的類都必須實現超類的所有抽象方法,除非子類也是抽象類。

如果一個類包含一個或多個抽象方法,則該類必須宣告為抽象類。抽象類不需要包含抽象方法。

抽象方法以分號結尾。例如:public abstract sample();

示例

public abstract class SuperClass {
   abstract void m();   // abstract method
}

class SubClass extends SuperClass {
   // implements the abstract method
   void m() {
      .........
   }
}

Synchronized 修飾符

synchronized 關鍵字用於指示方法一次只能被一個執行緒訪問。synchronized 修飾符可以與任何四個訪問級別修飾符一起使用。

示例

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

Transient 修飾符

例項變數被標記為 transient 以指示 JVM 在序列化包含它的物件時跳過該特定變數。

此修飾符包含在建立變數的語句中,位於變數的類或資料型別之前。

示例

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

Volatile 修飾符

volatile 修飾符用於讓 JVM 知道訪問該變數的執行緒必須始終將其自己的變數私有副本與記憶體中的主副本合併。

訪問 volatile 變數會同步記憶體中所有變數的快取副本。Volatile 只能應用於例項變數,這些變數是物件型別或私有型別。volatile 物件引用可以為 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() 在一個執行緒(您使用 Runnable 啟動的執行緒)中呼叫,而 stop() 在另一個執行緒中呼叫。如果在第 1 行中使用了 active 的快取值,那麼當您在第 2 行中將 active 設定為 false 時,迴圈可能不會停止。這時您需要使用volatile

java_modifier_types.htm
廣告

© . All rights reserved.