上節課給大家介紹的數據類型都學會了嗎?
java當中的類,方法,變量前面可以加入一些關鍵字,來表示這個定義的對象的訪問方式,這些關鍵字讓類,方法,變量有多種多樣的訪問方式。
那麼我們今天來看看今天的主角
今天的內容是修飾符:
1、修飾符
2、訪問控制符
3、非訪問控制符
第一部分:修飾符
修飾符是用來修飾類,方法,變量的關鍵字,放在標識符之前,用來表示這些對象訪問方式。
如public表示這個對象可以被工程內的所有對象可訪問。static表示對象以內存共享的方式訪問,且不需要實例化。等等。
按照修飾符的特點分爲:
1、訪問控制符
2、非訪問控制符
第二部分:訪問控制符。
訪問控制符來定義類、變量、方法和構造方法的訪問權限。也用來參與對象的封裝。
Java支持4種不同的訪問權限。分爲:
默認的,不指定修飾符,在同一包內可見,不使用任何修飾符。
私有的,以 private 修飾符指定,在同一類內可見。
共有的,以 public 修飾符指定,對所有類可見。
受保護的,以 protected 修飾符指定,對同一包內的類和所有子類可見。
圖解:
注意:
對象的成員屬性和成員方法即使有可訪問的權限(如public),也必須先創建對象,才能調用屬性和方法。
第二部分:非訪問控制符
除了訪問控制符之外的,其他的修飾符稱爲非訪問控制修飾符。主要有:
static 靜態訪問修飾符,內存共享唯一實例
final 最終訪問修飾符,表示類、方法無法繼承,變量無法更改
abstract 抽象訪問修飾符,表示類或方法需要重新實現
synchronized 同步訪問修飾符,線程同步互斥鎖
transient 非序列化訪問修飾符,變量不參與序列化
volatile 內存共享訪問修飾符,變量內存訪問共享值
一一來介紹下:
1、static
static可以用來修飾變量、方法和類
static關鍵字用來聲明獨立於對象的靜態變量,無論一個類實例化多少對象,它的靜態變量只有一份拷貝。靜態變量也被稱爲類變量。局部變量不能被聲明爲 static變量。
例:
class Test{
public static flag = "A";
}
任何Test創建的對象都共享這個屬性flag的值,任一對象更改這個屬性值,其他對象的該屬性值也會被改變。
static關鍵字用來聲明獨立於對象的靜態方法。靜態方法不能使用類的非靜態變量。靜態方法從參數列表得到數據,然後計算這些數據。
靜態方法不需要初始化對象,直接可以使用。
例:我們定義一個工具方法,判斷數字是否大於0 且小於100
public class Util{
public static boolean isLargeThanZero(int x){
return x>0 && x<100;
}
}
那麼,其他類的方法使用時,就可以直接Util.isLargerThanZero(50)去調用。不需要Util util = new Util();util.isLargerThanZero(50)
靜態內部類
static關鍵字聲明的內部類不需要初始化,直接可以使用內部的方法和變量。但是隻能聲明爲內部類。
這部分內部類再詳述。
2、final修飾符
final修飾符也可以修飾類,方法,變量
final 變量:
final 變量能被顯式地初始化並且只能初始化一次。如果變量是對象類型,只可以更改對象屬性值。
final 修飾符通常和 static 修飾符一起使用來創建類常量。
例:
final int x = 0; 此時,x=10就是錯誤的,因爲不能再賦值啦。
final User user = new User(); 此時,user = new User()是錯誤的,但是user.setName(“aa”)是可以的,因爲沒有更改變量的地址。
final 方法
類中的 final 方法可以被子類繼承,但是不能被子類修改。
聲明 final 方法的主要目的是防止該方法的內容被修改。
final 類
final 類不能被繼承,沒有類能夠繼承 final 類的任何特性。
final類和方法我們再講述繼承時再詳述。
3、abstract修飾符
abstract能修飾類和方法,不能修飾變量
abstract修飾類:
abstract修飾類時,類稱爲抽象類。
一個類不能同時被 abstract 和 final 修飾。
abstract修飾方法
abstract修飾方法時,方法稱爲抽象方法,抽象方法是一種沒有任何實現的方法。
抽象方法不能被聲明成 final 和 static。
abstract類和方法我們再講述繼承時再詳述。
4、synchronized修飾符
synchronized可以修飾方法、方法塊
可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多隻有一個線程執行這段代碼。當兩個併發線程訪問同一個對象object中的這個加鎖同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊。然而,當一個線程訪問object的一個加鎖代碼塊時,另一個線程仍然可以訪問該object中的非加鎖代碼塊。
同步方法:
public synchronized void synMethod(){
//方法體
}
同步代碼塊:
public Object synMethod(Object a1){
synchronized(a1){
//一次只能有一個線程進入
}
}
5、transient修飾符
transient修飾符用於修飾成員變量,代表該成員變量不參與對象的序列化。
也就是說,對象在被轉換爲流時,會忽略這個關鍵字修飾的屬性;流轉換爲對象時,也會忽略這個屬性。
序列化 (Serialization)將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程。
6、volatile修飾符
volatile修飾符用於修飾成員變量,表示這個變量在內存中對各個線程的內存可見性。
一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾之後,那麼就具備了兩層語義:
1)保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。
2)禁止進行指令重排序。
至此,修飾符就告一段落啦。。我們回顧下今天的內容:
1、四種訪問控制符和範圍
2、非訪問控制符和修飾對象,特性。
are you get it?