static 關鍵字主要用於管理記憶體,可用在variables, methods, blocks, nested classed。加上static關鍵字的物件,會在啟動程式當下就會賦予記憶體位置給此物件,後續無論實例化多少次,記憶體的位置都相同。
以class舉例,static class 與 非static class的差別:
class OuterClass {
private static String msg = "Hello!";
private String msg2 = "Moto";
//加上static的類別
public static class NestedStaticClass {
//靜態class只能調用外部class的靜態成員
public void printMsg() {
System.out.println("msg = " + msg);
}
}
//非static類
public class InnerClass {
//外部不管static還是無static都能調用
public void display() {
System.out.println("Msg = " + msg + msg2);
}
}
class Main { // 創建static內部類以及非static內部類
public static void main(String args[]) {
//創建static內部類實例
OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();
printer.printMsg();
//創建非static內部類的方法,需要先創建外部類的實例。
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.display();
}
與static相同可以用來宣告一個類別、函數或變數。
final 類別:無法被繼承。
final 函數:繼承的子類別無法override。
final變數:變數值無法被修改。
而有時有沒有加上static會影響到內存泄露的問題,像是以下Handler出現的問題,說由於Handler類沒有設置為static 所以導致了內存洩漏的問題。
具體的原因為,因為非static內部類和匿名內部類都可以調用外部類的方法或參數,而當我們要結束外部類(例如MainActivity時),Handler還有消息並沒有被處理完畢,系統會判斷MainActiviy還有可能被使用到,所以不能回收,導致內存洩漏。
具體來說,問題出在:
所以要想辦法解決上方的問題,以下是可以的幾個解決辦法:
以上是這次簡單的整理。
參考資料: