六、 static、final和常量設(shè)計

1. static

  • static 靜態(tài)的,Java中特殊的關(guān)鍵字
  • 可作用在
    • 變量
    • 方法
    • 匿名方法塊
  • 靜態(tài)變量,類共有成員
    • static變量值依賴于類存在(通過類即可訪問),不依賴于對象實例存在
    • 所有的對象實例的靜態(tài)變量都共享存儲在一個共同的空間(棧)
  • static方法
    • 靜態(tài)方法也無需通過對象來引用,而通過類名可以直接引用
    • 在靜態(tài)方法中,只能使用靜態(tài)變量,不能使用非靜態(tài)變量
    • 靜態(tài)方法禁止引用非靜態(tài)方法
  • static塊
    • 只在類第一次被加載是調(diào)用
    • 執(zhí)行順序:static塊>匿名塊>構(gòu)造函數(shù)
    • 不建議編寫代碼塊,不便于理解

2. 單例模式

  • 又名單態(tài)模式,Singleton
  • 限定某一個類在整個程序運行過程中,只能保留一個實例對象在內(nèi)存空間
  • 單例模式是GoF的23種設(shè)計模式中經(jīng)典的一種,屬于創(chuàng)建型模式類型
    • 設(shè)計模式:在軟件開發(fā)過程中,經(jīng)過驗證的,用于解決在特定環(huán)境下的、重復(fù)出現(xiàn)的、特定問題的解決方案
  • 保證一個類有且只有一個對象
    • 采用static來共享對象實例
    • 采用private構(gòu)造函數(shù),防止外界new操作
public class Singleton {
    private static Singleton obj = new Singleton(); //共享同一個對象
    private String content;
    
    private Singleton()  //確保只能在類內(nèi)部調(diào)用構(gòu)造函數(shù)
    {
        this.content = "abc";
    }
    
    public String getContent()  {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }   
    
    public static Singleton getInstance()   {
        //靜態(tài)方法使用靜態(tài)變量
        //另外可以使用方法內(nèi)的臨時變量,但是不能引用非靜態(tài)的成員變量
        return obj;
    }
    
    
    public static void main(String[] args) {
        Singleton obj1 = Singleton.getInstance();
        System.out.println(obj1.getContent());  //abc
        
        Singleton obj2 = Singleton.getInstance();
        System.out.println(obj2.getContent());  //abc
        
        obj2.setContent("def");
        System.out.println(obj1.getContent());
        System.out.println(obj2.getContent());
        
        System.out.println(obj1 == obj2); //true, obj1和obj2指向同一個對象
    }

}

3. final

  • 可以用來修飾類、方法、字段
  • final的類不能被繼承
  • 父類中final的方法,子類不能改寫此方法
  • final的變量,不能被再次賦值
    • 如果是基本類型的變量,不能修改其值
    • 如果是對象實例,那么不能修改其指針(但是可以修改對象內(nèi)部的值)

4. 常量設(shè)計和常量池

常量設(shè)計:

  • 常量:一種不會修改的變量
    • Java中沒有constant關(guān)鍵字
    • 不能修改 final
    • 不會修改/只讀/只要一份 static
    • 方便訪問public
  • Java中常量
    • public static final
    • 全大寫,以連字符相連
  • 一種特殊的常量:接口內(nèi)定義的變量默認是常量

常量池:

  • Java為很多基本類型的包裝類/字符串都建立常量池
  • 常量池:相同的值只存儲一份,節(jié)省內(nèi)存,共享訪問
  • 基本類型的包裝類
    • Boolean,Byte,Short,Integer,Long,Character,F(xiàn)loat,Double
    • Boolean: true, false
    • Byte: -128~127, Character: 0~127
    • Short, Int, Long: -128~127
    • Float,Double:沒有常量池
  • Java為常量字符串都建立常量池緩存機制
  • 基本類型的包裝類和字符串有兩種創(chuàng)建方式
    • 常量式(字面量)賦值創(chuàng)建,放在棧內(nèi)存(將被常量化)
    • new對象進行創(chuàng)建,放在堆內(nèi)存(不會被常量化)
  • Integer類
    • 基本類型和包裝類比較,將對包裝類自動拆箱
    • 對象比較,比較地址
    • 加法+會自動拆箱
  • String類
    • 常量賦值和new創(chuàng)建不是同一個對象
    • 編譯器之后優(yōu)化確定的字符串,并緩存

5. 不可變對象和字符串

不可變對象(Immutable Object)

  • 如何創(chuàng)建不可變對象:
    • immutable對象是不可改變,有改變,請clone/new一個對象進行修改
    • 所有的屬性都是final和private的
    • 不提供setter方法
    • 類是final的,或者所有的方法都是final
    • 類中包含mutable對象,那么返回拷貝需要深度clone
  • 優(yōu)點:
    • 只讀,線程安全
    • 并發(fā)讀,提高性能
    • 可以重復(fù)使用
  • 缺點
    • 制造垃圾,浪費空間
  • 字符串是Java使用最多的類,是一種典型的不可變對象
    • String兩種定義:常量賦值(棧分配內(nèi)存),new對象(堆分配內(nèi)存)
    • 字符串內(nèi)容比較:equals方法
    • 是否指向同一個對象:指針比較==
    • 修改字符串可采用StringBuffer(同步,線程安全,修改快速)和StringBuilder(不同步,線程不安全,修改更快)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容