Java關鍵字final、static使用總結

來源:互聯網
上載者:User

標籤:並且   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使用總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.