小朋友你是否对java中的static满脸问号
看完博主的這一篇博客不僅讓你滿臉問號,還讓你渾身充滿問號
皮一下很開心(小聲bb)
目錄:
1static的作用
2.static的應用場景
3.靜態實例變量的區別
4.訪問靜態變量和方法的方式
5.靜態代碼塊和其他代碼塊的執行順序
6.靜態內部類
7.靜態導包
1.static的作用
(1)static是一個能創建獨立于具體對象的域變量或者方法
即使沒有創建對象也能使用的屬性和方法(這一點很重要),這些方法和屬性不單獨屬于某一個實例化的對象,而是為所有對象共享有點中央空調的意思,相當于中央空調有n個女朋友(女朋友指代這里的對象),然后這些女朋友都有同一個男朋友
(2)形成靜態代碼塊優化性能
靜態代碼塊能放在類的任何一個地方,當類首次被加載的時候就會執行靜態代碼塊里邊的內容(一般代碼塊都是初始化的作用),而且是只會加載一次并且在第一次加載的時候分配內存空間(以后創建對象不用重新分配),第二次加載類的時候就不會再執行
注意這里雖然只初始化一次但是還可以根據自己的意愿去更改它初始化的值的,被一個對象更改所有對象的值都會更改因為它是共享
由于它只會加載一次的特性,所以很多只需要初始化一次的東西放在里邊,比那些只要創建對象就會加載一次的代碼塊效率高得多,所以就會優化程序性能
2.static的應用場景
(1)修飾成員變量
(2)修飾成員方法
(3)靜態代碼塊
(4)靜態內部類
3.靜態變量和實例變量的區別(重點)
(1)簡單來說就是用static修飾的成員變量就是靜態變量,不用static修飾的成員變量就是實例變量
(2)不同對象的實例變量都有不同的內存空間,而所有對象的靜態變量都是同一塊地址的值
(3)訪問方式有所區別
靜態方法和實例有相同的區別。我們有時候把靜態的方法和靜態變量稱為類方法和類變量
4.訪問靜態的變量和靜態方法
(1)訪問靜態變量:
類名.靜態變量
實例對象.靜態方法
(2)訪問靜態方法:
類名.靜態變量
對象.靜態方法
(3)關于靜態方法訪問的注意事項:
我們知道靜態方法只能訪問靜態方法和靜態屬性,但是有時我們卻能在main方法中調用非靜態的方法這是為啥,如下圖:
這為啥不報錯
這里就要講一下靜態和非靜態變量是何時被初始化的:
首先靜態變量在類被jvm加載的時候就會分配內存然后初始化,這時候非靜態變量并沒有分配內存,你在靜態的方法初始化的時候調用這些還沒分配內存的數據就會發生錯誤,所以靜態方法里邊不能調用非靜態成員,當我們創建一個新的對象的時候,那么那些非靜態的屬性就會被分配內存和初始化,這時候你再在靜態方法里邊調用就能想應的屬性和方法就不會產生錯誤了,所以當在靜態方法里邊實例化對象后就可以調用那些非靜態的屬性
可能這里有杠精又來了,那么照你這么說非靜態方法不是也不能調用非靜態方法嗎(事實上是可以的),
這里的非靜態方法之所以能調用非靜態方法是因為他們同時分配內存,編譯器不會認為那個調用別的方法的方法頭大就先給它分配內存,而是同時分配(都是在創建一個實例化對象的時候分配),所以只要非靜態方法調用別的非靜態方法,那么他倆都是已經存在的,自然就可以正常調用
5.靜態代碼塊和其他代碼塊等的執行順序
1.先講幾個塊(當作休息😁):
(1)構造代碼塊:也叫構造初始化塊
如圖:只有一個中括號的代碼塊就是構造初始化塊
(2)普通代碼塊:也是一個只有一個中括號的代碼塊和構造代碼塊不同的是他是存在方法里邊的
如圖:
(3)靜態代碼塊:
和構造代碼塊寫法上沒有大的區別就是在中括號后邊加一個static
如圖;
接下來很重要:
由于普通代碼塊需要我們手動調用,而其他代碼塊系統自動調用所有我們就不把普通代碼塊拿出來和另外兩個比較了(因為它穩
的最后執行),順便把自動調用的構造方法拿來比較
如圖:
結果是
沒想到吧哈哈,構造函數平時np哄哄的,現在倒數,三個靜態代碼塊高居前三
總之
在單個類中執行順序:靜態代碼塊>構造代碼塊>構造函數
在繼承中:父類靜態代碼塊>子類靜態代碼塊>父類構造代碼塊>父類構造函數>子類構造代碼塊>子類構造函數
這里的構造代碼塊和靜態代碼塊區別在于,構造代碼塊在每次創建新的對象的時候都會執行一遍代碼塊里邊的內容,而且是每個對象獨有的,每個對象此代碼塊所在內存空間不同(一個用情專一,一個朝三暮四,博主當然是第一種人)
6.靜態內部類
如果你對內部類不熟或者就只是對靜態內部類不熟悉那么就來圍觀博主的另一篇博客:
java內部類詳解
7.靜態導包
(1)格式:
import static
(2)作用:
這兩個關鍵字連用可以指定導入某個類中的指定靜態資源,并且不需要使用類名調用類中靜態成員可以直接使用類中靜態成員變量和成員方法
例子:
最后有一個注意點
局部變量不能用static修飾
總結
以上是生活随笔為你收集整理的小朋友你是否对java中的static满脸问号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正儿八经的详细讲java内部类
- 下一篇: 细品java封装继承多态