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

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

相關文章
相關標籤/搜索