[Java基礎]static,final修飾符
一.static
1.static能修飾的範圍及語法:
class TestStatic{ static { } static class ClassStatic{ } static String a; public static void staticFuntion() { } }
i.靜態構造塊,載入時間在類資訊載入之記憶體中時就被載入了,只會被載入一次,以後對這個類的操作就與這個靜態塊無關了
ii.靜態內部類,載入時間與其他略有不同,它不會隨著外部類的載入而載入,它的載入時間在它被呼叫時才會被載入
iii.靜態方法,載入時間就是類資訊的載入時間,這種狀態的方法是不可被覆蓋的,也就是說可以過載但不能被重寫
iv.靜態變數,載入時間就是類資訊的載入時間,這種變數是和類資訊一起存放在靜態域當中的,所以每個例項對其的更改都會影響到別的例項,也就是說這個變數是共享的
2.static的一些補充知識點
i.被static修飾的成員可以直接使用類命.成員名的方式訪問,如Arrays.copyOf()
ii.靜態的方法裡因為載入時間在例項化物件之前,所以在其內部是無法使用this或者super關鍵字的,因為jvm在載入的時候無法分辨this和super指的是哪個
iii.靜態方法不能訪問非靜態的成員
二.final
1.final能修飾的範圍以及語法
class TestFinal{ final static String a = "a"; final String b = "b"; public final void function() { } final class TestFinal1{ } }
i.靜態常量
ii.例項常量
iii.最終方法
iv.最終類
2.final細節
i.基礎資料變數被final修飾後值無法改變,而引用變數被final修飾後只是該引用指向的地址無法更改,也就是不能指向其他的例項,但這個例項的內部資料更改並不會與final關鍵字衝突
ii.靜態常量和例項常量的差別:靜態常量有static的特性,然後兩者也因static的有無而產生了賦值時機的差異,靜態常量的賦值時機只能在1.初始化的時候,2.靜態塊內;而例項常量的賦值時機在1,初始化的時候,2.構造塊內,3.構造方法內
需要注意的是在構造方法內對例項常量進行賦值時必須每個構造方法都能覆蓋到,否則就會報錯jvm會認為這個常量有可能無值
iii.最終方法:與靜態方法一樣,無法被覆蓋
iv.final類:無法被繼承,如String 就是被final修飾的