thinking in java (四) ----- static與this關鍵字
static
static代表什麼
static表示“全域性”或者“靜態”的意思,用來修飾成員變數或者方法,也可以修飾程式碼塊。被static修飾的成員會在類載入的時候進行初始化與空間分配,被設定為靜態後,成員會被存放在靜態儲存空間,全域性共享一個值。因此訪問被static修飾的成員時,可以使用className直接呼叫。
被static修飾的不依賴於物件,因為他先與物件生成,但是可以被物件共享,所有物件的引用指向的都是同一個地方,任何一個例項物件對其進行的修改都會導致其他例項的變化。
public class User { private static int userNumber = 0 ; public User(){ userNumber ++; } public static void main(String[] args) { User user1 = new User(); User user2 = new User(); System.out.println("user1 userNumber:" + User.userNumber); System.out.println("user2 userNumber:" + User.userNumber); } } ------------ Output: user1 userNumber:2 user2 userNumber:2
可以看到user1輸出的值也是2,是因為在new user2的時候,對靜態變數userNumber進行了修改。
static如何使用
static可以用來修飾成員變數和成員方法,稱之為靜態變數和靜態太方法,可以直接通過類名訪問,也可以通過物件例項訪問
static修飾的程式碼塊是靜態程式碼塊,當類進行載入的時候,就會執行靜態程式碼塊。有的程式碼塊比較適合用在靜態程式碼塊中。
static變數
靜態變數和例項變數的區別:
靜態變數是隨著類載入時,完成初始化的,在記憶體中僅僅存在一個,且JVM只會為他分配一次記憶體,同時類的例項都是共享靜態變數,可以直接通過類名,也可以通過物件例項訪問。
例項變數是便隨物件例項生成的,與物件例項同生共死。
所以一般在以下情況下使用靜態變數:常量,物件之間共享資料,訪問方便
static方法
非靜態方法既可以訪問靜態資料成員 又可以訪問非靜態資料成員,而靜態方法只能訪問靜態資料成員;
非靜態方法既可以訪問靜態方法又可以訪問非靜態方法,而靜態方法只能訪問靜態資料方法。靜態方法不能用到this super等關鍵字,引用靜態方法時,可以用類名.方法名或者物件名.方法名的形式。
static程式碼塊
被static修飾的程式碼塊,我們稱之為靜態程式碼塊,靜態程式碼塊會隨著類的載入一塊執行,而且他可以隨意放,可以存在於該了的任何地方。
static侷限
- 只能呼叫static變數
- 只能呼叫static方法
- 不能引用super this
- static變數在定義時,要進行初始化,且初始化時間在類載入時候
總結:無論是變數,方法,還是程式碼塊,只要用static修飾,就是在類被載入時就已經"準備好了",也就是可以被使用或者已經被執行,都可以脫離物件而執行。反之,如果沒有static,則必須要依賴於物件例項。
this關鍵字
- this呼叫本類的屬性,也就是類中的成員變數
- this呼叫本類中的其他方法
- this呼叫本類中的其他構造,並且只能放在構造方法的首行
呼叫本類成員變數
Public Class Student {
String name; //定義一個成員變數name
private void SetName(String name) { //定義一個引數(區域性變數)name
this.name=name; //將區域性變數的值傳遞給成員變數
}
}
這是一段最常見的程式碼,有一個成員變數name,在set方法中,將形參name傳遞給成員變數name。問題來了,編譯器是如何判斷是將形參name賦值給成員name,還是成員name傳給形參name。這時候就是this起作用了,this這個關鍵字就是代表的是物件中的成員變數或者方法 ,也就是說只要加上this,變數指的就是這個物件的成員變數或者方法,而不是形參或者區域性變數,因此上面程式碼就是指的將形參name,賦值給this.name(成員變數)。
一般情況下,引用成員變數或者成員方法的時候,都是以物件名.成員變數(成員方法)的方式。不過在考慮程式碼易讀性的情況下,可以使用this關鍵字來區分現在引用的變數是成員變數,方法,而不是區域性變數。可以理解為,this就是代表物件的名字。
呼叫本類構造方法
public class Student { //定義一個類,類的名字為student。
public Student() { //定義一個方法,名字與類相同故為構造方法
this(“Hello!”);
}
public Student(String name) { //定義一個帶形式引數的構造方法
}
}
this除了能夠呼叫成員變數和方法,還能呼叫建構函式。在上面的程式碼中定義了倆建構函式,在其中一個呼叫了另外一個建構函式this("hello")。在構造方法中呼叫this關鍵字 表示呼叫其他的建構函式,具體呼叫哪個是根據形參來決定的。
呼叫建構函式有一個限制,一般來說this關鍵字呼叫構造方法,只能方法構造方法的第一句。
返回物件的值
除了可以用來呼叫成員變數和方法之外,this關鍵字還有一個最大的作用是返回類的reference,在程式碼中,可以使用return this來返回某類的引用,這時候this關鍵字代表;類的名稱。如果在程式碼上面student類中,那麼程式碼的含義就是return student。課件,this還可以作為類的返回值。