Java非訪問修飾符
Java提供了一些非訪問修飾符來實現很多其他的功能。
-
static 修飾符用於創建類的方法和變量
-
final 修飾符的類最終實現,方法和變量的實現。
-
abstract 修飾符用於創建抽象類和方法。
-
synchronized 和 volatile 修飾符這是用於線程
static 修飾符:
Static 變量:
靜態關鍵字用於創建,將獨立的類中創建任何實例存在變數。靜態變量的一個副本,無論存在的類的實例的數量。
靜態變量也被稱為類變量。局部變量不能被聲明為static。
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 變量:
final變量可以顯式初始化一次。聲明為final引用變量不能被重新分配到引用一個不同的對象。
然而該對象內的數據是可以改變的。這樣的對象的狀態可以改變,但不引用。
變量使用 final 修飾符通常用於靜態,使常數的類變量。
例子:
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方法不能被任何被子類覆蓋。如前麵提到的最終修飾符防止被修改在子類中的方法。
做一個這樣的方法最終的主要目的是,該方法的內容不應受到任何外界改變。
例子:
聲明在類聲明中的final修飾符的方法,如下麵的例子:
public class Test{ public final void changeName(){ // body of method } }
final 類:
使用被聲明為final的類的主要目的是防止類被創建子類。如果一個類被標記為final 則冇有類可以從最終的類繼承的任何功能。
例子:
public final class Test { // body of class }
abstract 修飾符:
abstract 類:
抽象類不能被實例化。如果一個類被聲明為抽象的那麼唯一目的是為類進行擴展。
一個類不能既是抽象和final。 (因為一個final類不能擴展)。如果一個類包含抽象方法那麼這個類必須聲明為abstract。否則編譯錯誤將被拋出。
一個抽象類可以包含抽象方法和普通的方法。
例子:
abstract class Caravan{ private double price; private String model; private String year; public abstract void goFast(); //an abstract method public abstract void changeColor(); }
abstract 方法:
一個抽象的方法是用任何實現聲明的方法。方法本體(實現)是由子類提供。抽象方法不能是最終的或嚴格。
繼承抽象類的任何類都必須實現父類的所有抽象方法,除非子類也是一個抽象類。
如果一個類包含一個或多個抽象方法那麼這個類必須被聲明為abstract。一個抽象類,並不需要包含抽象方法。
抽象方法以分號結束。例如: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行的主動緩存的值時,該循環時,可能會設置為活動為false,在第2行不會停止。這就是為什麼想使用volatile。