static(靜態)關鍵字的特點和用法


→靜態:static
用法:是一個修飾符,用於修飾成員(成員變量,成員函數)
class Person
{
    String country = "cn";
}
/*每實例化一個Person對象,每個對象在堆內存中都有一個country
而加上static以后,就只在內存總存在一個靜態的country被其他的對象直接調用,可以節省內存空間。
當成員被靜態修飾以后,除了可以被對象調用外,還可以直接被類名調用。*/
特有內容隨着對象存儲
比如person類,每個中國人都有自己的名字,而國籍都是一樣的中國,所以contry可以定義為static而name不用。


→static特點
1、隨着類的加載而加載
也就是說:靜態會隨着類的消失而消失,說明他的生命周期最長
2、優先於對象存在
3、被所有對象所共享
4、可以直接被類名調用
   
→int age(成員變量)實例變量和 static int age(靜態成員變量)類變量的區別
1、存放為着
實例變量是隨着對象的創建而存在堆內存中
類變量隨着類的加載而存在於方法區中
2、生命周期
實例變量隨着對象的消失而消失
類變量生命周期最長,隨着類的消失而消失

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

→靜態的好處和壞處
好處:對對象的數據進行單獨空間的存儲,節省空間,沒有必要每個對象中的存儲一份
          可以直接被類名調用(Person.country)
壞處:生命周期過長。
          訪問出現局限性。(只能訪問靜態)

→什么時候使用靜態呢?

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

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

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


→靜態的應用

每一個應用程序都有共性的功能
可以將這些功能進行抽取,獨立封裝
以便復用。
把成員方法都定義成static的直接用類名調用。

一個類中會有一個默認的構造函數,這個構造函數的權限和所屬的類一致
靜態代碼塊
格式:
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變量


免責聲明!

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



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