一.static
static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊。它不依賴類特定的實例,被類的所有實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。
- 靜態變量:
按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另一種是沒有被static修飾的變量,叫實例變量。
兩者的區別是:
- 對于靜態變量在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存,在加載類的過程中完成靜態變量的內存分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。
- 對于實例變量,沒創建一個實例,就會為實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響(靈活)。
- 靜態方法:
靜態方法可以直接通過類名調用,任何的實例也都可以調用。
靜態方法中不能用this和super關鍵字(原因),不能直接訪問所屬類的實例變量和實例方法,只能訪問所屬類的靜態成員變量和成員方法。因為實例成員與特定的對象關聯!
因為static方法獨立于任何實例,因此static方法必須被實現,而不能是抽象的abstract。 - 靜態代碼塊:
靜態代碼塊是一段在加載類時會執行的程序代碼。它會在其他程序可以使用該類之前就執行,所以很適合放靜態final變量的初始化代碼。(靜態代碼塊會在構造函數之前執行)
class Box{
final static int width;
static{
width = 10;
}
}
靜態成員、靜態方法中不能用this和super關鍵字;
二.final
- ** final類:**
final的類代表你不能繼承該類,也就是創建他的子類。因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,并且確信這個類不會載被擴展,那么就設計為final類。例如:String Interger -
final方法:
final的方法代表你不能覆蓋該方法,但是可以重載;如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
使用final方法的原因有二:
- 把方法鎖定,防止任何繼承類修改它的意義和實現。(例如:方法的功能已經足夠完整了,子類中不需要改變 )
- 高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。
- ** final的變量:**
final的變量代表你不能改變它的值; - final static常量:
public static final double PI = 3.14
- 空白final:
class Box{
final int width;
Box( int number){
width = number;
}
}
width盡管被聲明成final,但卻未得到一個初始值。無論在哪種情況下,空白final 都必須在實際使用前得到正確的初始化。而且編譯器會主動保證這一規定得以貫徹。然而,對于final 關鍵字的各種應用,空白final 具有最大的靈活性。位于類內部的一個final 字段可以對每個對象都可以有所不同,同時依然保持其“不變”的本質。
- final參數:
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。
public void print(final int i) {
//i++; //i是final類型的,值不允許改變的.
System.out.print(i);
}
總結:
- 對于基本數據類型,final表示該變量的數值不會被改變。
- 對于對象,final表示該引用變量的值不會被改變。即:該引用變量指向一個對象之后不能再指向其他的對象。但是,對象本身的內容是可以修改的。(集合的內容)
* 靜態final變量必須在聲明或靜態初始化程序中初始化賦值;
* 非靜態final變量必須在聲明或構造函數中初始化賦值;
- final關鍵字的好處:
- final關鍵字提高了性能。JVM和Java應用都會緩存final變量。
- final變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。
- 使用final關鍵字,JVM會對方法、變量及類進行優化。(?)
- 注意:
- final不能用于修飾構造方法
三.this
this 關鍵字只能在方法內部使用,表示對“調用方法的那個對象”的引用。
- this關鍵字的一種用法,當參數名和數據成員名相同時,防止歧義。(數據成員會被局部變量屏蔽)
class Box{
int a = 2;
public void print(int a){
this.a = a;
}
}