1. 程式人生 > >thinking in java (四) ----- static與this關鍵字

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侷限

  1. 只能呼叫static變數
  2. 只能呼叫static方法
  3. 不能引用super this
  4. static變數在定義時,要進行初始化,且初始化時間在類載入時候

總結無論是變數,方法,還是程式碼塊,只要用static修飾,就是在類被載入時就已經"準備好了",也就是可以被使用或者已經被執行,都可以脫離物件而執行。反之,如果沒有static,則必須要依賴於物件例項。

this關鍵字

  1.  this呼叫本類的屬性,也就是類中的成員變數
  2. this呼叫本類中的其他方法
  3. 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還可以作為類的返回值。

參考: http://www.cnblogs.com/chenssy/