Java高階語法---static

 

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

 

static:面試

靜態static,不少時候會令我望文生義,可是get到了static最重要的一點,其餘的理解都還ok。spa

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

即便System.gc() 都不會被回收,So,static很容易引發內存泄漏。對象

官方的解釋就是:static能夠修飾屬性、方法和內部類,static修飾屬性或方法後,屬性和方法不在屬於某個特定的對象,而是全部的共享,也就是說static成員不依賴blog

某個對象,在類加載是就被初始化了;static修飾的屬性或方法,能夠直接使用類名調用,而不用先實例化對象再調用。內存

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

1. 某個銀行的帳戶計算器,用來計算銀行帳戶個數,那麼此計算器屬性就是全部對象共有的屬性,就應該用static修飾;源碼

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

就能夠用static 修飾;(源碼currentTimeMillis()方法:public static native long currentTimeMillis(); )

還能夠和麪試官說,本身曾經遇到過一個內存泄漏的問題,就是由於static修飾的一個Map類型的變量致使的,集合容器用static修飾,不須要的對象沒有被及時處理致使集合愈來愈大,最後經過排查類堆棧信息找到問題所在,這波static面試美滋滋。

 

 FYI:

 1 import java.util.HashMap;  2 import java.util.Map;  3 import lombok.extern.slf4j.Slf4j;  4 
 5 @Slf4j  6 public class TestStatic {  7     private static String staticName = "share";  8     @SuppressWarnings("unused")  9     private String unstaticName = "unshare"; 10     @SuppressWarnings("rawtypes") 11     public static Map map = new HashMap(); 12     @SuppressWarnings("unused") 13     public static void main(String[] args) { 14         String myName = TestStatic.staticName; 15        //String youName = TestStatic.unstaticName; unable
16  TestStatic.staticMethod(); 17         //TestStatic.unstaticMethod(); unable
18         TestStatic.testOutOfMemmory(args, args);  //存儲對象的容器是static容器形成內存泄漏 19         //System.gc(); unWork
20  } 21     public static void staticMethod() { 22         log.info("I'm static method, share."); 23  } 24     public void unstaticMethod() { 25         log.info("I'm unstatic method, can't share."); 26  } 27     @SuppressWarnings("unchecked") 28     public static void testOutOfMemmory(String[] name,String[] age) { 29  map.put(name, age); 30  } 31     
32 }
相關文章
相關標籤/搜索