static用來修飾靜態的變量、方法、(靜態內部類)
被static修飾的元素所有對象僅此一份,存儲在方法區。
被static修飾的屬性在類加載的時候就初始化好了。
被static修飾的方法和屬性可以直接使用類名.方法名/屬性名調用
一般用於對象之間共享數據吧。
靜態方法中只能使用靜態變量,它內部也沒有this引用,因為它不屬於任何一個對象。
只能使用靜態變量的原因是,可能使用方法時實例變量還沒有初始化好
static方法必須被實現,不能是抽象的。
static代碼塊,被用來初始化static變量或者執行某些特定的方法,只會在類加載的時候執行一次。
感覺static沒什么。可以理解為,被static修飾的所有東西都是屬於類的,只有這一份的,重點關注以下static代碼塊,在類加載的時候比較重要。因為,它和類加載有關系哈
對象初始化的順序:
首先是類加載,類加載的過程中為靜態變量初始化,以及載入靜態方法(先加載父類,再加載子類)
其次是調用static代碼塊,static代碼塊的作用是為靜態變量賦值,可以調用靜態方法(先調用父類的,再調用子類的)
然后是初始化對象,先執行非靜態代碼塊,再執行構造函數(也是先調用父類的再調用子類的)
在這三個過程中,並不是說一次性把父類的所有的初始化方式一次性執行完,而是把所有的對象初始化,分為了這三個階段。
但是第一步和第二步只會執行一次,被反復執行的是第三步。
其實可以分為兩個階段會好理解一點吧;
第一個階段是類加載及初始化:
先加載父類,再加載子類
首先把所有的類加載進來之后,從父類開始依次向下的初始化類變量。(初始化變量意思是指的,將變量的值設置為程序中所直接 int a = 10,這樣的常量。就直接變為10,如果沒有寫明的話,初始化為零值)
第二個階段是對象初始化;:
(執行靜態代碼塊,從父類到子類,不顧哦這個過程在程序運行時期只會執行一次,執行的時刻是在new這個類的對象之前的時候執行static代碼塊,並不是在類的加載之后又立馬執行)
對象初始化的話,也是從父類開始初始化,父類初始化完成之后再初始化子類。(先執行父類的非static代碼塊,然后構造函數,然后子類的非static代碼塊,構造函數)
這樣就好理解一點啦。