mark一下,今天的做業。java
java-core P115ide
若是將域定義爲static,每一個類中只有一個這樣的域。(這裏的域應該是指一片物理數據空間,而不是單純的指代某一個變量,而是靜態域)。大數據
public class Test1st { public static int aaa=1; public static int bbbb=2;} public class Testabc { @Test public void testTest(){ System.out.println("aaa:"+Test1st.aaa+",bbb:"+Test1st.bbbb); } } com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 test.Testabc,testTest aaa:1,bbb:2 Process finished with exit code 0
每一個對象對於本身的實例域都有本身的一份拷貝,靜態域屬於類,不屬於任何獨立的對象。spa
靜態方法是一種不能向對象實施操做的方法。線程
如下兩種狀況下使用靜態方法:code
1.一個方法不須要訪問對象狀態,全部參數都是經過顯示參數提供。對象
2.一個方法只須要訪問類的靜態域,例如(Employee.getNextId)blog
工廠模式中用static關鍵字較多,每一個類對象均可以對公有域進行修改,可是公有常量(final)不能夠,final+static+public的合用能夠避免公有常量被類對象修改。即避免公有方法中的常量對象被新的對象覆蓋和修改,從而影響到公有常量的正確性。內存
e.gssl
public class System{ ... public static final PrintStream out=...; ... } System.out =new PrintStream(...);//ERROR- out is final
靜態內部類
1.內部類的概念:定義在一個類中的類,能夠訪問該類做用域中的數據,包括private的數據,且對同個package中的其餘類隱藏。
2.有時候使用內部類只是爲了把一個類隱藏在另外一個類的內部,而不須要內部類引用外部類對象。能夠將內部類聲明爲static,以便取消產生的引用。(該內部類不須要引用外部對象,而外部對象須要完成一些操做可是不想從新建立一個其餘的類,因而建立一個內部類,在外部對象中直接調用這個內部類的方法,該內部類若是不是static,會在被引用時報錯。P244)
回收機制(本身總結的,可能有誤,請參考多方)
類相關的信息加載後是存儲在Method Area(線程公有部分,存儲包括類信息,常量,靜態變量,編譯器代碼等,如HotSpot的永久代)中,通常除了classloader卸載該類,那麼該部分的信息不會被回收掉。
方法區得回收通常是針對常量池和對類的卸載。當方法區沒法知足內存分配需求時,會發生OOM。
以此致使的內存泄漏問題類型較多。
內存泄漏相關:
Android 參考
1.類的靜態變量持有大數據對象:靜態變量長期維持對象的引用,阻止垃圾回收。
public static final Bitmap=......;
2.非靜態內部類的靜態實例
非靜態內部類會維持一個到外部類實例的引用,若是非靜態內部類維持的這個實例是靜態的,就會間接長期維持着外部類的引用,阻止被系統回收
3.Handler臨時性內存泄漏(*)
Handler非靜態,在與MessageQueue和Activity/Service之間交流時,若是Message在Queue中等待時間過長,會致使handler不會被回收。若是Handler是非靜態的,會致使Acitivity或者Service不會被回收。
4.容器中的對象沒清理
一般把一些對象的引用加入集合中,若是不須要該對象時,若是沒有把引用從集合中清理掉,這個集合就會愈來愈大,若是這個集合時static,狀況更加嚴重。