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(不同步,線程不安全,修改更快)