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);
}
}