mark一下,今天的作業。
java-core P115
如果將域定義為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
每個對象對於自己的實例域都有自己的一份拷貝,靜態域屬於類,不屬於任何獨立的對象。
靜態方法是一種不能向對象實施操作的方法。
以下兩種情況下使用靜態方法:
1.一個方法不需要訪問對象狀態,所有參數都是通過顯示參數提供。
2.一個方法只需要訪問類的靜態域,例如(Employee.getNextId)
工廠模式中用static關鍵字較多,每個類對象都可以對公有域進行修改,但是公有常量(final)不可以,final+static+public的合用可以避免公有常量被類對象修改。即避免公有方法中的常量對象被新的對象覆蓋和修改,從而影響到公有常量的正確性。
e.g
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,情況更加嚴重。