標籤:並且 span 改變 靜態成員變數 繼承 建立 div log nbsp
一、final
根據程式上下文環境,Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類別、非抽象類別成員方法和變數。為什麼要這麼做,可出於兩種理解:設計或效率。 final類不能被繼承,沒有子類,final類中的方法預設是final的。那麼在調用時->類.方法
final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變數表示常量,只能被賦值一次,賦值後值不再改變。
final不能用於修飾構造方法。
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法預設是final類型的。1、final類
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,預設都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴充,那麼就設計為final類。2、final方法
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
使用final方法的原因有二:
第一、把方法鎖定,防止任何繼承類修改它的意義和實現。
第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。
例如:
public class Test1 { public static void main(String[] args) { // TODO 自動產生方法存根 } public void f1() { System.out.println("f1"); } //無法被子類覆蓋的方法 public final void f2() { System.out.println("f2"); } public void f3() { System.out.println("f3"); } private void f4() { System.out.println("f4"); } } public class Test2 extends Test1 { public void f1(){ System.out.println("Test1父類方法f1被覆蓋!"); } public static void main(String[] args) { Test2 t=new Test2(); t.f1(); t.f2(); //調用從父類繼承過來的final方法 t.f3(); //調用從父類繼承過來的方法 //t.f4(); //調用失敗,無法從父類繼承獲得 } }
3、final變數(常量)
用final修飾的成員變數表示常量,值一旦給定就無法改變!
final修飾的變數有三種:靜態變數、執行個體變數和局部變數,分別表示三種類型的常量。
從下面的例子中可以看出,一旦給final變數初值後,值就不能再改變了。
另外,final變數定義的時候,可以先聲明,而不給初值,這中變數也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。為此,一個類中的final資料成員就可以實現依對象而有所不同,卻有保持其恒定不變的特徵。
public class Test3 { private final String S = "final執行個體變數S"; private final int A = 100; public final int B = 90; public static final int C = 80; private static final int D = 70; public final int E; //final空白,必須在初始化對象的時候賦初值 public Test3(int x) { E = x; } /** * @param args */ public static void main(String[] args) { Test3 t = new Test3(2); //t.A=101; //出錯,final變數的值一旦給定就無法改變 //t.B=91; //出錯,final變數的值一旦給定就無法改變 //t.C=81; //出錯,final變數的值一旦給定就無法改變 //t.D=71; //出錯,final變數的值一旦給定就無法改變 System.out.println(t.A); System.out.println(t.B); System.out.println(t.C); //不推薦用對象方式訪問靜態欄位 System.out.println(t.D); //不推薦用對象方式訪問靜態欄位 System.out.println(Test3.C); System.out.println(Test3.D); //System.out.println(Test3.E); //出錯,因為E為final空白,依據不同對象值有所不同. System.out.println(t.E); Test3 t1 = new Test3(3); System.out.println(t1.E); //final空白變數E依據對象的不同而不同 } private void test() { System.out.println(new Test3(1).A); System.out.println(Test3.C); System.out.println(Test3.D); } public void test2() { final int a; //final空白,在需要的時候才賦值 final int b = 4; //局部常量--final用於局部變數的情形 final int c; //final空白,一直沒有給賦值. a = 3; //a=4; 出錯,已經給賦過值了. //b=2; 出錯,已經給賦過值了. } }
4、final參數
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。
public class Test4 { public static void main(String[] args) { new Test4().f1(2); } public void f1(final int i) { //i++; //i是final類型的,值不允許改變的. System.out.print(i); } }
二、static
static關鍵字主要有兩種作用:http://www.cnblogs.com/ssjie/p/4841065.html
第一,為某特定資料類型或對象分配單一的儲存空間,而與建立對象的個數無關。
第二,實現某個方法或屬性與類而不是對象關聯在一起
具體而言,在Java語言中,static主要有4中使用方式:成員變數、成員方法、代碼塊和內部類
(1)static成員變數:
Java類提供了兩種類型的變數:用static關鍵字修飾的靜態變數和不用static關鍵字修飾的執行個體變數。靜態變數屬於類,在記憶體中只有一個複製,只要靜態變數所在的類被載入,這個靜態變數就會被分配空間,因此就可以被使用了。對靜態變數的引用有兩種方式,分別是“類.靜態變數"和”對象.靜態變數"
執行個體變數屬於對象,只有對象被建立後,執行個體變數才會被分配記憶體空間,才能被使用,它在記憶體中存在多個複製,只有用“對象.執行個體變數”的方式來引用。
(2)static成員方法:
Java中提供了static方法和非static方法。static方法是類的方法,不需要建立對象就可以被調用,而非static方法是對象的方法,只有對象被建立出來後才可以被使用
static方法中不能使用this和super關鍵字,不能調用非static方法,只能訪問所屬類的靜態成員變數和成員方法,因為當static方法被調用時,這個類的對象可能還沒被建立,即使已經被建立了,也無法確定調用哪個對象的方法。同理,static方法也不能訪問非static類型的變數。
(3)static代碼塊:
static代碼塊在類中是獨立於成員變數和成員函數的代碼塊的。注意:這些static代碼塊只會被執行一次
(4)static與final結合使用表示的意思:對於變數,若使用static final修飾,表示一旦賦值不能修改,並且通過類名可以訪問。對於方法,若使用static final修飾,表示該方法不可被覆蓋,並且可以通過類名直接存取。 在Java語言中,不能在成員函數內部定義static變數
Java關鍵字final、static使用總結