Java關鍵字理解與總結(未完)

weixin_33912246發表於2015-07-28

一.static

static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊。它不依賴類特定的例項,被類的所有例項共享。只要這個類被載入,Java虛擬機器就能根據類名在執行時資料區的方法區內找到他們。因此,static物件可以在它的任何物件建立之前訪問,無需引用任何物件。

  1. 靜態變數:
    按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。
    兩者的區別是:
  • 對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。
  • 對於例項變數,沒建立一個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。
  1. 靜態方法:
    靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫。
    靜態方法中不能用this和super關鍵字(原因),不能直接訪問所屬類的例項變數和例項方法,只能訪問所屬類的靜態成員變數和成員方法。因為例項成員與特定的物件關聯!
    因為static方法獨立於任何例項,因此static方法必須被實現,而不能是抽象的abstract。
  2. 靜態程式碼塊:
    靜態程式碼塊是一段在載入類時會執行的程式程式碼。它會在其他程式可以使用該類之前就執行,所以很適合放靜態final變數的初始化程式碼。(靜態程式碼塊會在建構函式之前執行)
class Box{

 final static int width;

 static{
    width = 10;
 }
}

靜態成員、靜態方法中不能用this和super關鍵字;

二.final

  1. ** final類:**
    final的類代表你不能繼承該類,也就是建立他的子類。因此final類的成員方法沒有機會被覆蓋,預設都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴充套件,那麼就設計為final類。例如:String Interger
  2. final方法:
    final的方法代表你不能覆蓋該方法,但是可以過載;如果一個類不允許其子類覆蓋某個方法,則可以把這個方法宣告為final方法。
    使用final方法的原因有二:
  • 把方法鎖定,防止任何繼承類修改它的意義和實現。(例如:方法的功能已經足夠完整了,子類中不需要改變 )
  • 高效。編譯器在遇到呼叫final方法時候會轉入內嵌機制,大大提高執行效率。
  1. ** final的變數:**
    final的變數代表你不能改變它的值;
  2. final static常量:
    public static final double PI = 3.14
  3. 空白final:
class Box{
     final int width;
     Box( int number){
        width = number;
     }
}

width儘管被宣告成final,但卻未得到一個初始值。無論在哪種情況下,空白final 都必須在實際使用前得到正確的初始化。而且編譯器會主動保證這一規定得以貫徹。然而,對於final 關鍵字的各種應用,空白final 具有最大的靈活性。位於類內部的一個final 欄位可以對每個物件都可以有所不同,同時依然保持其“不變”的本質。

  1. final引數:
    當函式引數為final型別時,你可以讀取使用該引數,但是無法改變該引數的值。
public void print(final int i) { 
    //i++;    //i是final型別的,值不允許改變的. 
    System.out.print(i); 
} 

總結:
- 對於基本資料型別,final表示該變數的數值不會被改變。
- 對於物件,final表示該引用變數的值不會被改變。即:該引用變數指向一個物件之後不能再指向其他的物件。但是,物件本身的內容是可以修改的。(集合的內容)
* 靜態final變數必須在宣告或靜態初始化程式中初始化賦值;
* 非靜態final變數必須在宣告或建構函式中初始化賦值;

  1. final關鍵字的好處:
  • final關鍵字提高了效能。JVM和Java應用都會快取final變數。
  • final變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷。
  • 使用final關鍵字,JVM會對方法、變數及類進行優化。(?)
  1. 注意:
  • final不能用於修飾構造方法

三.this

this 關鍵字只能在方法內部使用,表示對“呼叫方法的那個物件”的引用。

  1. this關鍵字的一種用法,當引數名和資料成員名相同時,防止歧義。(資料成員會被區域性變數遮蔽)
class Box{
    int a = 2;
    public void print(int a){  
        this.a = a;
    }
}

相關文章