各修飾符final ,static的使用

final

有三種使用場景,分別是修飾變量方法類,無論哪種修飾,一旦聲明爲final類型,你將不能改變這個引用了,編譯器會檢查代碼,如果你試圖再次初始化,編譯器會報錯

1、修飾變量 
當final修飾一個變量的時候一般把他作爲常量,通常和static關鍵字配合使用。例如: 
private static final String ISSUCCESS_FLAG = “true”;一般static修飾的常量都用大寫字母來表示。

String str1 = "12";
final String str2 = "1";
String str3= "1";
boolean a=(str1==(str2+"2"));
boolean b=(str1==(str3+"2"));
這裏a和b的值分別是什麼? 
顯然a=true,b=false 
此時str2+”2”其實就是”1”+”2”操作的是常量之間的連接操作,而str3+”2”其實是new String(“12”);他和str1是兩個對象,內存地址不同
2、修飾方法 
當一個方法被final修飾後,表示該方法不能被子類重寫,final方法有一個好處是比非final方法要快,因爲在編譯時已經靜態綁定了,不需要在運行時在動態綁定。 
3、修飾類 
當一個類被final修飾後,表示該類是完整的,不能被繼承,例如Java中String、Integer類都是final類 

final修飾的優點

  • final關鍵字提高了性能。JVM和Java應用都會緩存final變量。
  • final變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。
  • 使用final關鍵字,JVM會對方法、變量及類進行優化。
  • 不可變類創建不可變類要使用final關鍵字。不可變類是指它的對象一旦被創建了就不能被更改了。String是不可變類的代表。不可變類有很多好處,譬如它們的對象是隻讀的,可以在多線程環境下安全的共享,不用額外的同步開銷等等。
   接口不能被final修飾,沒有意義。

  java接口可以是public 的,也可以是friendly的,但一定是abstracted的。

  java接口裏的方法只能是public的、abstract的。

  java接口裏的成員變量只能是public 的,static 的,final的;並且必須賦初值,否則通不過編譯。

    static 關鍵字

  1. 用來修飾成員變量,將其變爲類的成員,從而實現所有對象對於該成員的共享;
  2. 用來修飾成員方法,將其變爲類方法,可以直接使用“類名.方法名”的方式調用,常用於工具類;
  3. 靜態塊用法,將多個類成員放在一起初始化,使得程序更加規整,其中理解對象的初始化過程非常關鍵;
  4. 靜態導包用法,將類的方法直接導入到當前類中,從而直接使用“方法名”即可調用類方法,更加方便。

public class TestStatic {
    public static void main(String[]args){
        System.out.println(S.getStatic());//使用類名加前綴訪問靜態方法
        S s=new S();
        System.out.println(s.getStatic());//使用實例化對象名訪問靜態方法
        System.out.println(s.get());
    }
    public static class S
    {
        private static int a;
        private int t=0;

        //靜態初始器:由static和{}組成,只在類裝載的時候(第一次使用類的時候)執行一次,往往用來初始化靜態變量。
        static{
            a=10;
        }

        //靜態方法只能訪問靜態數據成員
        public static int getStatic()
        {
            return a;
        }

        public int getT()
        {
            return t;
        }

        //非靜態方法可以訪問靜態方法和非靜態方法
        public int get()
        {
            getT();
            getStatic();
            t=a;//非靜態方法可以訪問非靜態數據成員和靜態數據成員
            return t;
        }
    }
}

如上圖所示:

各修飾符的作用域如下:其中默認修飾符在子類中可以訪問,在不同包中不能訪問



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章