Java提供了許多非訪問修飾符來實作許多其他功能,
static修飾符用于創建類方法和變數,final修飾符用于完成類,方法和變數的實作,abstract修飾符用于創建抽象類和方法,synchronized和volatile修飾符,用于執行緒,
下面來逐個了解和學習這些非訪問修飾符,
1. static修飾符
1.1. 靜態變數
static關鍵字用于創建獨立于類實體的變數,無論類的實體數有多少個,都只存在一個靜態變數副本,靜態變數也稱為類變數,區域變數不能宣告為static,
1.2. 靜態方法
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
Shell
2. final修飾符
2.1. 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; // 會出錯,不能重新賦值
}
}
2.2. final方法
任何子類都不能覆寫final方法, 如前所述,final修飾符可防止在子類中修改方法,
宣告final方法的主要目的是不讓其它人改變方法的內容,
示例
可以在類宣告中使用final修飾符宣告方法,如下例所示 -
public class Test {
public final void changeName() {
// 方法主體
}
}
2.3. final類
使用宣告為final的類的主要目的是防止類被子類化, 如果一個類被標記為final,那么這個類不能被其它類繼承,
示例
public final class Test {
// body of class
}
3. abstract飾符
3.1. 抽象類
抽象(abstract)類不能實體化,如果一個類宣告為抽象(abstract),那么唯一的目的是擴展該類,
一個類不能是同時是abstract和final(因為final類不能被擴展), 如果一個類包含抽象方法,那么該類應該被宣告為abstract, 否則,將拋出編譯錯誤,
抽象類可以包含抽象方法以及普通方法,
示例
abstract class Caravan {
private double price;
private String model;
private String year;
public void getYear(String y){};// 這是一個普通方法
public abstract void goFast(); // 這是一個抽象方法
public abstract void changeColor();// 這是一個抽象方法
}
3.2. 抽象方法
抽象方法是在沒有任何實作的情況下宣告的方法, 方法體(實作)由子類提供, 抽象方法永遠不會是最終的或嚴格的,
擴展抽象類的任何類都必須實作超類的所有抽象方法,除非子類也是抽象類,
如果一個類包含一個或多個抽象方法,那么該類必須宣告為abstract, 抽象類不需要包含抽象方法,
抽象方法以分號結尾, 示例:public abstract sample();
示例
public abstract class SuperClass {
abstract void m(); // 抽象方法
}
class SubClass extends SuperClass {
// 實作抽象方法
void m() {
// 實作代碼.........
}
}
4. synchronized修飾符
synchronized關鍵字用于指示一次只能訪問一個方法的方法,synchronized修飾符可以應用于四個訪問級別修飾符中的任何一個,
示例
public synchronized void showDetails() {
.......
}
5. transient修飾符
實體變數標記為transient,表示JVM在序列化包含它的物件時跳過特定變數,
此修飾符包含在創建變數的陳述句中,位于變數的類或資料型別之前,
示例
public transient int limit = 55; // will not persist
public int b; // will persist
6. volatile修飾符
volatile修飾符用于讓JVM知道訪問變數的執行緒必須始終將其自己的變數私有副本與記憶體中的主副本合并,
訪問volatile變數會同步主記憶體中變數的所有快取復制, volatile只能應用于實體變數,型別為private, 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
}
}
通常,在一個執行緒(使用Runnable開始的執行緒)中呼叫run(),并從另一個執行緒呼叫stop(), 如果在第1行中使用了active的快取值,那么當在第2行中將active設定為false時,回圈可能不會停止,

完整的Java初級,高級對應的學習路線和資料!專注于java開發,分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式、分布式及面試資料、開源專案,助力開發者成長!
歡迎關注微信公眾號:碼邦主

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/221731.html
標籤:其他
下一篇:Java基本運算子
