java -static的特性和使用,靜態類/方法/塊/內部類/回收機制


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,情況更加嚴重。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM