中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

《Java架構筑基》從Java基礎講起——深入理解Static

發布時間:2020-06-26 10:05:47 來源:網絡 閱讀:224 作者:未來可期_ 欄目:編程語言

1. static的作用和特點

可以用來修飾:成員變量,成員方法,代碼塊,內部類等。具體如下所示

修飾成員變量和成員方法

  • 被 static 修飾的成員屬于類,不屬于單個這個類的某個對象,被類中所有對象共享,可以并且建議通過類名調用。
  • 被static 聲明的成員變量屬于靜態成員變量,靜態變量存放在Java內存區域的方法區。

靜態代碼塊

  • 靜態代碼塊定義在類中方法外,靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)
  • 該類不管創建多少對象,靜態代碼塊只執行一次.

靜態內部類(static修飾類的話只能修飾內部類)

靜態內部類與非靜態內部類之間存在一個最大的區別:

  • 非靜態內部類在編譯完成之后會隱含地保存著一個引用,該引用是指向創建它的外圍內,但是靜態內部類卻沒有。沒有這個引用就意味著:1.它的創建是不需要依賴外圍類的創建。2.它不能使用任何外圍類的非static成員變量和方法。

靜態導包(用來導入類中的靜態資源,1.5之后的新特性):

  • 這兩個關鍵字連用可以指定導入某個類中的指定靜態資源,并且不需要使用類名調用類中靜態成員,可以直接使用類中靜態成員變量和成員方法。

static關鍵字的特點

  • 隨著類的加載而加載
  • 優先于對象存在
  • 被類的所有對象共享
  • 可以通過類名調用【靜態修飾的內容一般我們稱其為:與類相關的,類成員】

static的注意事項

  • 在靜態方法中是沒有this關鍵字的
    • 靜態是隨著類的加載而加載,this是隨著對象的創建而存在。
    • 靜態比對象先存在。
  • 靜態方法只能訪問靜態的成員變量和靜態的成員方法【靜態只能訪問靜態,非靜態可以訪問靜態的也可以訪問非靜態的】

2. static變量存儲位置

static變量存儲位置

  • 注意是:存儲在JVM的方法區中
  • static變量在類加載時被初始化,存儲在JVM的方法區中,整個內存中只有一個static變量的拷貝,可以使用類名直接訪問,也可以通過類的實例化對象訪問,一般不推薦通過實例化對象訪問,通俗的講static變量屬于類,不屬于對象,任何實例化的對象訪問的都是同一個static變量,任何地放都可以通過類名來訪問static變量。

3. 用static靜態變量潛在性問題

用static靜態變量潛在性問題

  • 占用內存,并且內存一般不會釋放;
  • 在系統不夠內存情況下會自動回收靜態內存,這樣就會引起訪問全局靜態錯誤。
  • 在Android中不能將activity作為static靜態對象,這樣使activity的所有組件對象都存入全局內存中,并且不會被回收;

4. 靜態變量的生命周期

靜態變量的生命周期

  • 類在什么時候被加載?
  • 當我們啟動一個app的時候,系統會創建一個進程,此進程會加載一個Dalvik VM的實例,然后代碼就運行在DVM之上,類的加載和卸載,垃圾回收等事情都由DVM負責。也就是說在進程啟動的時候,類被加載,靜態變量被分配內存。

5. 靜態變量何時銷毀

靜態變量何時銷毀

  • 類在什么時候被卸載?在進程結束的時候。
  • 說明:一般情況下,所有的類都是默認的ClassLoader加載的,只要ClassLoader存在,類就不會被卸載,而默認的ClassLoader生命周期是與進程一致的

6. 靜態引用的對象回收

靜態引用的對象回收

  • 只要靜態變量沒有被銷毀也沒有置null,其對象一直被保持引用,也即引用計數不可能是0,因此不會被垃圾回收。因此,單例對象在運行時不會被回收

7. 靜態方法變量內存圖

描述Dog對象:

public class Dog {
    public static String name;

    public static int age;

    public static void showNameAge() {
        System.out.println("name:" + name + " age:" + age);
    }
}

main測試方法:

public class Demo01 {
    public static void main(String[] args) {
        Dog.name = "阿白";
        Dog.age = 98;

        Dog.name = "李雙";
        Dog.age = 90;

        Dog.showNameAge();
    }
}

//執行結果:name:李雙 age:90

大概流程就是

  1. 執行 java Demo01 是給JVM發送指令,和JVM說:把這個 Demo01.class 去執行;
  2. JVM就去執行 Demo01.class 文件里面的字節碼,首先第一步 是把 Demo01.class字節碼加載進內存;
  3. 第二步把Demo01.class放入字節碼存放區;
  4. 第三步把Demo01里面的靜態數據(靜態變量 與 靜態方法)分配到 靜態區;
  5. 第四步main方法進棧,如何進棧的,是把靜態區里面的main方法拿到運行區(棧) 然后就進棧了;
  6. 第五步main方法執行 Demo. 的時候,就在此時 才把Dog.class加載進內存;
  7. 第六步把Dog.class放入字節碼存放區;
  8. 第七步把Dog里面的靜態數據(靜態變量 與 靜態方法)分配到 靜態區;
  9. 第八步 在main方法中執行 Dog.name 是向靜態區去找到 Dog.name 拿來使用,由于是共享的 name 只保持最后修改的數據;

8. 靜態變量和成員變量的區別

A:所屬不同

  • 靜態變量屬于類,所以也稱為類變量
  • 成員變量屬于對象,所以也稱為實例變量(對象變量)

B:內存中位置不同

  • 靜態變量存儲于方法區的靜態區
  • 成員變量存儲于堆內存

C:內存出現時間不同

  • 靜態變量隨著類的加載而加載,隨著類的消失而消失
  • 成員變量隨著對象的創建而存在,隨著對象的消失而消失

D:調用不同

  • 靜態變量可以通過類名調用,也可以通過對象調用
  • 成員變量只能通過對象名調用
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

子洲县| 都昌县| 绥芬河市| 冕宁县| 来凤县| 莱州市| 广水市| 潞城市| 荃湾区| 上虞市| 改则县| 庆安县| 措美县| 额尔古纳市| 彭山县| 辽源市| 彭泽县| 崇州市| 宾川县| 房产| 汝州市| 蒙自县| 西贡区| 长泰县| 郴州市| 建水县| 师宗县| 姚安县| 西畴县| 天台县| 胶州市| 华安县| 新兴县| 宝丰县| 时尚| 海口市| 金山区| 南开区| 南江县| 赣州市| 卓尼县|