Java語言提供了很多修飾符,主要分爲以下兩類:
- 訪問修飾符
- 非訪問修飾符
修飾符用來定義類、方法或者變量,通常放在語句的最前端。
訪問修飾符
類
名稱 | 說明 | 備註 |
---|---|---|
public | 可以被所有類訪問(使用) | public類必須定義在和類名同名的文件中 |
無訪問修飾符(默認) | 可以被同一個包中的類訪問(使用) | 默認的訪問權限,可以定義在其他文件中 |
接口
名稱 | 說明 | 備註 |
---|---|---|
public | 可以被所有類訪問(使用) | public接口必須定義在和接口名同名的文件中 |
無訪問修飾符(默認) | 可以被同一個包中的類訪問(使用) | 默認的訪問權限,可以定義在其他文件中 |
注意:
一個.java文件中只能有一個public修飾的類或者接口,如果有其它類或者接口,都是默認的無訪問修飾符。
接口裏的變量都隱式聲明爲 public static final,而接口裏的方法默認情況下訪問權限爲 public abstract。
變量
名稱 | 說明 | 備註 |
---|---|---|
public | 可以被任何類訪問 | |
protected | 可以被同一包中的所有類訪問 可以被所有子類訪問 |
子類沒有在同一包中也可以訪問 |
無訪問修飾符(默認) | 可以被同一包中的所有類訪問 | 如果子類沒有在同一個包中,也不能訪問 |
private | 只能夠被當前類的方法訪問 |
方法
名稱 | 說明 | 備註 |
---|---|---|
public | 可以被任何類訪問 | |
protected | 可以被同一包中的所有類訪問 可以被所有子類訪問 |
子類沒有在同一包中也可以訪問 |
無訪問修飾符(默認) | 可以被同一包中的所有類訪問 | 如果子類沒有在同一個包中,也不能訪問 |
private | 只能夠被當前類的方法訪問 |
注意:
- Java中子類重寫方法的訪問權限不能低於父類中權限。
非訪問修飾符
爲了實現一些其他的功能,Java 也提供了許多非訪問修飾符。
static
用來修飾類方法和類變量。
靜態變量:
static 關鍵字用來聲明獨立於對象的靜態變量,無論一個類實例化多少對象,它的靜態變量只有一份拷貝。 靜態變量也被稱爲類變量。局部變量不能被聲明爲 static。
靜態方法:
static 關鍵字用來聲明獨立於對象的靜態方法。靜態方法不能使用類的非靜態變量。靜態方法從參數列表得到數據,然後計算這些數據。
final
用來修飾類、方法和變量。
final 修飾的類不能夠被繼承,修飾的方法不能被重寫,修飾的變量爲常量,不可修改。
final 變量能被顯式地初始化並且只能初始化一次。被聲明爲 final 的對象的引用不能指向不同的對象。但是 final 對象裏的數據可以被改變。也就是說 final 對象的引用不能改變,但是裏面的值可以改變。
final 修飾符通常和 static 修飾符一起使用來創建類常量。
abstract
用來創建抽象類和抽象方法。
抽象類:
抽象類不能用來實例化對象,聲明抽象類的唯一目的是爲了將來對該類進行擴充。
一個類不能同時被 abstract 和 final 修飾。如果一個類包含抽象方法,那麼該類一定要聲明爲抽象類,否則將出現編譯錯誤。
抽象類可以包含抽象方法和非抽象方法。
抽象方法:
抽象方法是一種沒有任何實現的方法,該方法的的具體實現由子類提供。
抽象方法不能被聲明成 final 和 static。
任何繼承抽象類的子類必須實現父類的所有抽象方法,除非該子類也是抽象類。
如果一個類包含若干個抽象方法,那麼該類必須聲明爲抽象類。抽象類可以不包含抽象方法。
synchronized
用來修飾方法,變量還有代碼塊。
主要用於線程的編程。
進一步研究可以參考:Java關鍵字synchronized。
volatile
用來修飾成員變量。
volatile 修飾的成員變量在每次被線程訪問時,都強制從共享內存中重新讀取該成員變量的值。而且,當成員變量發生變化時,會強制線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
進一步研究可以參考:對於volatile型變量的特殊規則(深入理解Java虛擬機學習筆記)。
transient
用來修飾成員變量。
告訴編譯器,在類對象序列化時,此變量不需要持久保存。然後序列化的對象包含被transient修飾的實例變量時,Java虛擬機(JVM)跳過該特定的變量。
參考:
1.Java中各種修飾符與訪問修飾符
2.Java 修飾符