static關鍵字 和構造代碼塊

一.static關鍵字

1.什麼是static:

​ 靜態修飾符,修飾的方法成爲靜態方法,修飾的屬性成爲靜態屬性。

2 什麼時候應該使用static?

答:當該方法是不變的(通常是一些工具類,資源共享類的),且只需要加載一次的,就可以考慮static。

3.static的使用場景

因爲非靜態的屬性和方法都是隨着對象的創建而加載的(反過來講就是隻有對象存在時,非靜態的屬性和方法纔會存在),如果是要多個對象共用一個屬性或方法該怎麼辦?

答:在屬性和方法前使用static關鍵字修飾即可,可以實現數據共享。

在這裏插入圖片描述假設兩個窗口同時出售100張票,添加static修飾符,就可以將屬性ticketCount設置爲公共屬性,這樣t1.sale()和 t2.sale就會共用一個屬性值,同時出售這100張票。

問題1

:非靜態和靜態的屬性或方法如何調用

答: 非靜態只能通過對象調用,因爲非靜態的屬性和方法只有在創建對象的時候纔會被加載進內存

​ 靜態既可以通過對象調用,也可以通過類名調用,建議通過類名調用,(非靜態的屬性或方法是屬於類的)
在這裏插入圖片描述

問題2:

如果相互調用了會出現什麼問題,爲什麼?

答:不能在靜態的方法中調用調用非靜態的屬性和方法,但是可以在非靜態的方法中區調用靜態的屬性和方法 , 因爲非靜態的屬性和方法只有在創建對象的時候纔會被加載進內存,靜態的屬性和方法是通過對象纔會加載。
在這裏插入圖片描述

問題3:

靜態的屬性和方法是什麼時候加載進內存的?

答:Java文件在編譯時會被加載進內存中,其中靜態的屬性和方法都會隨着class文件的加載而加載(類加載的時候,靜態的屬性和方法就已經加載了)

二.構造代碼塊和靜態代碼構造塊

構造代碼塊就是一個沒有名字的構造器,同樣具有開闢空間和初始化的作用。

構造代碼塊的初始化比構造器的初始化時間早,所以會先運行構造代碼塊
在這裏插入圖片描述靜態代碼構造塊是在類加載的時候就開始運行的,所以輸出順序是3-2-1-5-4,因爲代碼構造塊先於構造器,所以2裏面的age爲默認值0,靜態方法和非靜態方法的順序取決於引用的順序。