static關鍵字與方法區和類加載


1.static的作用

答:將成員變量或方法存儲進方法區。因為方法區能保證數據只存在一份,只會加載一次(類加載器加載類的時候才加載一次)

注:static Object obj = new Object();方法區存儲的是obj這個引用變量,而不是Obejct這個被創建的對象,對象依舊存儲在堆中。只不過由於statcic 引用變量一直存在,導致堆中這個對象一直沒法被回收。

注:一定要區分什么叫變量!什么叫對象!方法區明文說的是:存儲靜態變量和靜態方法。是變量,即引用變量,不是對象。

java中對對象的控制室通過引用來控制的。所以控制了引用,就是控制了對象,引用就是變量!變量就是引用。可以在引用或變量加synchronized控制,以達到控制對象線程安全。

2.static修飾的變量和方法的存儲區域是哪里?

答:方法區。

3.存儲在方法區的數據是安全的么?

答:因為方法區是被所有線程共享的,所以必須考慮數據的線程安全。

方法區的數據不是線程安全的,因為方法區的內容是多線程共享的,所以要對static修飾的方法進行加鎖synchronized。以保證多線程訪問是安全的。

4.怎樣將數據存儲在方法區?

答:用static關鍵字修飾的變量和方法都會存儲在方法區里。

5.方法區中數據的生命周期是怎樣的?

答:一直伴隨着程序,和應用的生命周期一樣。

6.方法區溢出
答;方法區同樣存在垃圾收集,因為通過用戶定義的類加載器可以動態擴展java程序,一些類也會成為垃圾。jvm可以回收一個未被引用類所占的空間,以使方法區的空間最小。 

所以盡量在程序中少使用static關鍵字。因為加載類時候,類信息也都存儲在方法區里,所以方法區也裝了不少東西。

6.static特點

1、隨着類的加載而加載

也就是說:靜態會隨着類的消失而消失,說明他的生命周期最長

7.int age(成員變量)實例變量和 staticint age(靜態成員變量)類變量的區別

1、存放位置
實例變量是隨着對象的創建而存在堆內存中
類變量隨着類的加載而存在於方法區中
2、生命周期
實例變量隨着對象的消失而消失
類變量生命周期最長,隨着類的消失而消失

→靜態使用注意事項
1、靜態方法只能訪問靜態成員
2、靜態方法中不可以定義this,super關鍵字
因為靜態優先於對象存在,所以靜態方法中不可以出現this

→什么時候使用靜態呢?

要從兩個方面入手
因為靜態修飾的內容有成員變量和成員方法(函數)

什么時候定義靜態變量(類變量)呢?
當對象中出現共享數據時,該數據被靜態所修飾
對象中的特有數據要定義成非靜態存在於堆內存中。

什么時候定義靜態函數呢?
當功能內部沒有訪問到非靜態數據(對象的特有數據),那么該功能可以定義為靜態的。

靜態代碼塊
格式:
static
{
    靜態代碼塊中的執行語句;
}
//特點:隨着類的加載而執行,只執行一次。用於給類進行初始化。
如下例子:
class StaticCode
{
    static 
    {
        System,out.println("a");
    }
}

加載順序 靜態代碼塊-->構造代碼塊-->構造函數

對象的初始化過程
Person p = new Person("zhangsan",20);
1、因為new用到了Person.class。所以會先找到Person.class文件並加載到內存中。
2、執行該類中的static代碼塊(靜態代碼塊),如果有的話,給Person.class類進行初始化
3、在堆內存中開辟空間,非配內存地址
4、在堆內存中建立對象的特有屬性,並進行默認初始化
5、對屬性進行顯示初始化
6、對對象進行構造代碼塊初始化
7、對對象進行對應的構造函數初始化
8、將內存地址付給棧內存中的p變量
 

5.將數據存儲在方法區有什么好處?

答:1.節省內存空間。因為方法區的數據是在類加載器加載類時候,填寫進方法區的。同一個類,類加載器只會加載一次類。所以保證了方法區的內容都只存在一份。

class Person
{
    String country = "cn";
}
/*每實例化一個Person對象,每個對象在堆內存中都有一個country
而加上static以后,就只在內存總存在一個靜態的country被其他的對象直接調用,可以節省內存空間。
比如person類,每個中國人都有自己的名字,而國籍都是一樣的中國,所以contry可以定義為static而name不用。

 本文參考http://transcoder.baidu.com/from=2001a/bd_page_type=1/ssid=502f54484154495350414e1309/uid=0/pu=usm%400%2Csz%401320_2003%2Cta%40iphone_1_9.0_1_11.0/baiduid=5467C9315869C7DD0A81320AA41BD30F/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=17459822346989022625&order=1&fm=alop&tj=www_normal_1_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&title=static%28靜態%29關鍵字的特點和用法-viLyo-博客園&dict=30&w_qd=IlPT2AEptyoA_yiGCE_tIi3uCVxVgZUnuky&sec=15378&di=b4193b3d2627bac0&bdenc=1&tch=124.0.0.0.0.0&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRAVDbzOXTTUS4stmGGe2dYtXLR0WYn7wV2mqxjxmdN7HzwdcbqhRS1JB1YcNkk2dq&eqid=f24dbfeb21b530001000000657e2cc1c&wd=&clk_info=%7B"srcid"%3A"1599"%2C"tplname"%3A"www_normal"%2C"t"%3A1474481456100%2C"xpath"%3A"div-div-div-a-p"%7D

和http://shenlvcheng.iteye.com/blog/864940

感謝作者


免責聲明!

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



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