2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁技術文章正文

Java——static關鍵字

更新時間:2018-09-12 來源:黑馬程序員JavaEE培訓學院 瀏覽量:

【Java】——static關鍵字

 

static是什么???——》一個修飾符

那static作用于那???——》用于修飾成員

什么是成員???——》成員變量和成員函數

 

static修飾成員變量

static為什么修飾成員變量???——》解決數據的共享問題???——》static修飾的數據可以被每個對象共享的數據

為什么需要被每個對象共享某個數據???——》如果所有對象中某一個屬性的值是一樣的,那么在內存中會造成大量的數據重復;

 

那怎么實現static的作用???——》

 

被修飾后的成員變量的存儲如圖所示:

                   

被static修飾后的成員變量的存儲在哪里???——》即不在堆里也不在棧里,而是在方法區的靜態區里

靜態區???——》放一些靜態變量和靜態方法。

存放好了,那該如何調用這種數據(或方法)?——》類名調用

 

既然知道了static是什么和如何運用等;那么我們也該了解靜態變量和成員變量有什么區別???——》

·1)、別名不同???——》成員變量也稱為實例變量;靜態變量也稱為類變量。

·2)、兩個變量的生命周期不同???——》也是靜態的弊端,生命周期太長,但是也好過占用內存;——》成員變量隨著對象的創建而存在,隨著對象的回收而被釋放;

·3)、靜態變量隨著類的加載而存在,會隨著類的消失而消失???——》虛擬機結束了,類才會消失,并且類本身是一個對象,在內存里面也是按照對象的形式存儲的,只不過可以通過這個類對象創建很多對象來封裝具體的數據;

·4)、當類的數據過多的時候,垃圾回收機制可以對舊數據進行回收???——》當再次使用再重新加載,如果類很長時間不用就把它清除;

·5)、調用方式不同???——》成員變量只能被對象調用;——》靜態變量可以被對象調用,還可以被類名調用;

·注意:不管有沒有對象,都建議用類名調用???——》這是靜態的專屬調用方式,可閱讀性強,讓人看了一目了然,知道這是靜態變量;

·6)、類的類型變量與類變量不是一碼事???——》類的類型變量是由類定義的變量,類變量就是靜態變量;

·7)、數據存儲位置不同???——》成員變量數據存儲在堆內存的對象中,所以也叫對象的特有數據;——》靜態變量數據存儲在方法區的靜態區中,所以也叫對象的共享數據;

 

注意:

方法區???——》也叫共享區,數據區·····翻譯的名字多著呢,還記得之前五個區不?

方法存在方法區,調用時進棧;

 

當static修飾成員函數

為什么static要修飾成員函數使之成為一個靜態函數???——》這是因為static有其作用之處;

靜態函數作用于哪里???——》可以直接訪問靜態成員,靜態方法;但是如果要訪問成員方法,只能通過對象訪問;

為什么靜態成員的出現比對象要早???——》靜態變量和靜態方法都是存放在靜態區中的,會隨著類的加載而加載

如何使靜態函數調用非靜態方法(或靜態變量)???——》必須要在靜態函數內部創建一個對象???——》以確保對象是和靜態方法是一起出現的;???——》對象才調用非靜態的方法和變量;

 

使用static修飾成員函數該注意以下幾點:

1.靜態方法只能訪問靜態成員(包含成員變量成員函數),非靜態既可以訪問靜態又可以訪問非靜態;

2.靜態方法中不可以定義this(寫this是會報錯的)???——》因為用類名調用靜態方法時沒有對象,所以this沒有指向;

 

三句話圖解static在內存中的姿勢:

 

首先我們先來分析這段代碼:

當我們執行StaticDemo2的字節碼文件的時候,這個類被加載進內存,然后進行空間的開辟,不同種類數據存放在不一樣的地方。

方法區里有一個靜態區,存放靜態方法和數據,非靜態區里存放非靜態的方法和數據,它們都是被共享的。

非靜態區里面都有一個this所屬,內容只能被對象調用;

靜態區里有一個所屬是自己的類名,沒有this,this是不能寫在靜態方法里的,所以此時,當我們調用這個StaticDemo2類的時候,內存的加載如下:

 

當運行到主函數的時候,主函數進棧:

第一句話:使用到了Person類,此時找classPath路徑下是否有Person.class文件,如果沒有設置classPath,默認在當前路徑下找,找到Person文件后加載Person類,加載完畢后,運行method()方法,method()方法進棧,語句執行完畢,運行默認的return語句,方法出棧。

                           

第二句話:在主函數中定義一個Person類型的變量p,在堆中創建一個新對象,為對象分配地址,堆內存對對象進行數據初始化,然后傳參數進行構造函數初始化,構造函數進棧,執行完畢彈棧。                                                  

第三句話:p.show()在編譯運行之前都要檢查是否有show()方法,如果有show()方法,show()方法進棧,并且show()方法是非靜態的方法,所以show()方法里也應該有默認的this引用,此時this的值是所屬的函數的調用對象的值,在輸出語句中可以通過類的所屬找到country,通過this找到name和age。執行完畢后結束函數                                        不加靜態是在對象里,加了靜態是在方法區里;

不加靜態是特定對象特有,加了靜態對象共有。

對象的特有數據,必須存儲在對象中???——》數據在對象中都是不同,不能使用static修飾;

簡單點說,從源代碼看,該功能是否需要訪問非靜態的成員變量,如果需要,該功能就是非靜態的。如果不需要,就可以將該功能定義成靜態的,當然也可以定義成非靜態,但是非靜態需要被對象調用,而僅創建對象調用非靜態的方法,沒有訪問特有數據,該對象的創建是沒有意義的。

 

作者:黑馬程序員JavaEE培訓學院

首發:http://java.itheima.com/


分享到:
在線咨詢 我要報名
和我們在線交談!