1. 程式人生 > >Java高階語法---static

Java高階語法---static

 

背景:聽說static Java高階語法是挺進BAT必經之路。

 

static:

靜態static,很多時候會令我望文生義,但是get到了static最重要的一點,其他的理解都還ok。

static最重要的一點就是:類屬性中被static所引用的變數會被當作Gabage Collection的root根節點,而root就意味著著這一類變數基本上是不會被GC回收的,

即使System.gc() 都不會被回收,So,static很容易引起記憶體洩漏。

官方的解釋就是:static可以修飾屬性、方法和內部類,static修飾屬性或方法後,屬性和方法不在屬於某個特定的物件,而是所有的共享,也就是說static成員不依賴

某個物件,在類載入是就被初始化了;static修飾的屬性或方法,可以直接使用類名呼叫,而不用先例項化物件再呼叫。

在面試的時候還可以補充:當一個屬性或者方法和物件沒有關係,或者說是沒有任何物件共享的時候,那麼就可以用staic修飾,使其實現共享;例如:

1. 某個銀行的賬戶計算器,用來計算銀行賬戶個數,那麼此計算器屬性就是所有物件共有的屬性,就應該用static修飾;

2. System 類中的currentTimeMillis() 方法,用來獲取系統當前時間的毫秒值,這個方法和System 類的物件沒有關係,System類物件想要共享這個方法,那麼這個方法

就可以用static 修飾;(原始碼currentTimeMillis()方法:public static native long currentTimeMillis(); )

還可以和麵試官說,自己曾經遇到過一個記憶體洩漏的問題,就是因為static修飾的一個Map型別的變數導致的,集合容器用static修飾,不需要的物件沒有被及時處理導致集合越來越大,最後通過排查類堆疊資訊找到問題所在,這波static面試美滋滋。

 

 FYI:
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TestStatic {
    private static String staticName = "share";
    @SuppressWarnings("unused")
    private String unstaticName = "unshare";
    @SuppressWarnings("rawtypes")
    public static Map map = new HashMap();
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        String myName = TestStatic.staticName;
       //String youName = TestStatic.unstaticName;  unable
        TestStatic.staticMethod();
        //TestStatic.unstaticMethod();   unable
        TestStatic.testOutOfMemmory(args, args);  //儲存物件的容器是static容器造成記憶體洩漏
        //System.gc(); unWork
    }
    public static void staticMethod() {
        log.info("I'm static method, share.");
    }
    public void unstaticMethod() {
        log.info("I'm unstatic method, can't share.");
    }
    @SuppressWarnings("unchecked")
    public static void testOutOfMemmory(String[] name,String[] age) {
        map.put(name, age);
    }
    
}