學之廣在于不倦,不倦在于固志。 ——晉·葛洪-
(學問的淵博在于學習時不知道厭倦,而學習不知厭倦在于有堅定的目標)
001.Java修飾符:
??? ?? ---> 修飾符用來定義類、方法、或者變量,通常放在語句最前端
??? ?? ---> 修飾符分為:
????????????????????????????????? 訪問修飾符、非訪問修飾符
002.Java訪問修飾符:
??? ?? ---> 訪問修飾符也稱訪問控制符,是指能夠控制類、成員變量、方法(也包含構造方法)使用權限的關鍵字
??? ?? ---> 訪問修飾符用來限定外界(即調用者)對類、變量、方法的訪問范圍,主要包含四個訪問修飾符
????????????? 00a.private? >>> 私有的,同一類可以訪問
????????????????????????????????? >>> 修飾對象:變量、方法(可以修飾內部類)
??????????????????????????????????????????????????????????? 被private修飾的成員(內部類、變量、方法)只能被其自身(即所屬類)訪問,對其他類是不可見的
?????????????????????????????????? >>> 類(外部類)和接口不可以沒聲明為private
?????????????????????????????????? >>> private主要是隱藏類的實現細節(jié)和保護類的數據
?????????????????????????????????? >>> 聲明為私有訪問類型的變量只能通過類中公共的getter方法被外部類訪問
?????????????? 00b.default? >>> 默認訪問修飾符(即不使用任何關鍵字就表示default),同一包內可以訪問
?????????????????????????????????? >>> 修飾對象:類、接口、變量、方法
??????????????????????? ? ? ? ? ?? >>> default修飾的變量、方法,對同一包內的類可見(類的子類不可見),
?????????????????????????????????? >>> 接口里的變量隱式的聲明為 public static final,接口里的方法默認是訪問權限為 public
?????????????? 00c.protected? >>> 受保護的,對同一包內的類和所有子類可以訪問
??????????????????????? ?????????????? >>> 修飾對象:變量、方法(不能修飾外部類和接口)
?????????????????????????????????????? >>> 子類和基類在同一包內:被protected修飾的變量、方法和構造器可以被同一個包中的任何其他類訪問
?????????????????????????????????????????????? 子類和基類不在同一包內:在子類中,子類實例可以訪問其從基類繼承而來的protected方法,而不能訪問基類實例中的protected方法
???????????????????????? ? ? ? ? ? ? ? >>> 子類能訪問protected修飾的方法、變量,這樣可以避免不相關類使用這些方法和變量
??????????????? 00d.public? >>> 公共的,對所有類可見,能夠被任何其他類訪問
?????????????????????????????????? >>> 修飾對象:類、接口、方法、變量
?????????????????????????????????? >>> 如果幾個相互訪問的public類分布在不同的包中,則需要導入相應public類所在的包,由于類的繼承性,類的所有公共方法和變量都能被其他子類繼承
003.Java非訪問修飾符:
??? ? ? ---> 一種類型限定符,用來限定變量的類型
??? ? ? ---> 非訪問限定符有以下幾類:
????????????? 00a.static >>> 靜態(tài),用來修飾類方法、類變量(內部類推薦使用static,因為非靜態(tài)內部類對外部類持有強引用)
????????????????????????????? >>> 靜態(tài)變量:給變量前添加了static限定符
?????????????????????????????????????????????????????? 一般用于開放給外部類直接使用的變量,直接“類名.變量名”即可訪問,無需事先實例化類的對象
?????????????????????????????????????????????????????? static關鍵字用于表明獨立于對象的靜態(tài)變量,無論一個類實例化多少對象,它的靜態(tài)變量只有一份copy,該靜態(tài)變量在內存中的地址是固定的,類似于全局變量,每一次實例化對象,使用的靜態(tài)變量仍然是程序初始化的那個靜態(tài)變量
??????????????????????????????????????????????????????? 靜態(tài)變量是伴隨著類的加載而加載的,當類加載進內存的時候,靜態(tài)變量就已經伴隨著類的加載而加載進內存了,并且靜態(tài)變量只在類加載的時候加載一次,存放在方法區(qū)的靜態(tài)區(qū)中
??????????????????????????????????????????????????????? 全局變量也就是成員變量,是在創(chuàng)建對象的時候初始化的,所以只要創(chuàng)建對象就會初始化全局變量(成員變量),并存放在靜態(tài)區(qū)
?????????????????????????????? >>> 靜態(tài)方法:給方法名前加了static限定符
??????????????????????????????????????????????????????? 一般用于開放給外部類直接使用的方法,直接“類名.變量名”即可訪問直接“類名.方法名”即可訪問,無需事先實例化類對象
????????????????????????????????????????????????????? ? 靜態(tài)方法中只能調用靜態(tài)方法,不能調用非靜態(tài)方法
??????????????????????????????????????????????????????? 靜態(tài)方法中只能使用靜態(tài)的類變量,不能使用非靜態(tài)的類變量
??????????????????????????????????????????????????????? 靜態(tài)方法中不能使用this、super,即使this后面跟靜態(tài)類變量也不行
???????????????????? ? ?? ???? >>> 靜態(tài)類:給類名前加了static限定符
???????????????????????????????????????????????????? 一般用于開放給外部使用類中的內部類,這樣就可以直接“外部類.內部類”訪問一般用于開放給外部類直接使用的方法,
?????????????????????????????? >>> 靜態(tài)代碼塊:給“{}”前加static限定符(即static {})
??????????????????????????????????????????????????????????? 是在類中獨立于類成員的static代碼塊,它不在任何方法體內,它在類加載的時候執(zhí)行且僅執(zhí)行一次這些靜態(tài)代碼塊
??????????????????????????????????????????????????????????? 一般用于在使用JNI接口的地方,需要事先調用System.loadLibrary來加載so動態(tài)庫,或者在類加載時就需要執(zhí)行的方法或者需要對成員變量進行無條件初始化時使用
????????????? 00b.final? >>> 最終、固定不變的,用來修飾類、方法、變量(常見于變量)
?????????????????????????? ? >>> final變量:給變量前加final
???????????????????????????????????????????????????? final變量一般用于不希望變量值變更的場合,防止變量值修改產生不可預料的結果
???????????????????????????????????????????????????? final變量被顯式地初始化且只能初始化一次,被final修飾的對象的引用不能指向不同的對象,但是,final修飾的對象里的數據可以修改,也就是說final對象的引用不可改變,但是里面的值可以改變(如,一個point點對象,它的x,y值可以變化)
???????????????????????????????????????????????????? final修飾符通常和static一起使用來創(chuàng)建類的常量
? ? ? ? ? ? ? ? ? ? ? ? ? ?? >>>? final方法:給方法前加final
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 類中的final方法可以被子類繼承,但是不可修改
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 聲明為final的方法主要是防止該方法被修改? ? ? ??
????????????????????????????? >>> final類:給類前加final(通常見于系統(tǒng)源碼)
????????????????????????????????????????????????? final類不能被繼承,不可修改,是一個最終形態(tài)
????????????????????????????? >>> 一個特例:匿名內部類的局部變量
?????????????????????????????????????????????????????? 因為匿名內部類在編譯的時于方法是平級的,所以不能調用方法的變量,只能調用類的變量;但是一個匿名內部類非要調用方法的變量,就需要聲明該方法的變量為final類型,即把改變量當作一個常量來用
????????????? 00b.synchronized和volatile? >>> 線程相關的修飾符
??????????????????????????????????????????????????????????? >>>? synchronized 聲明的方法同一時間只能被一個線程訪問,常見于單例模式
??????????????????????????????????????????????????????????? >>>? volatile 修飾的成員變量在每次被線程訪問時,都強制從共享內存中重新讀取該成員變量的值,而且,當成員變量發(fā)生變化時,會強制線程將變化的值回寫到共享內存,這樣就可以保證在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值
?003.總結及注意:
??????????????????????????? java靜態(tài)對象的數據在全局是唯一的,一處改即全改,在內存空間上是固定的,會優(yōu)先分別靜態(tài)對象空間,非靜態(tài)對象反之;
????? ? ? ? ? ? ? ? ? ? ? ? java靜態(tài)變量初始化無法被阻止,它在被構造器調用之前就已經初始化了,在類的內部變量定義的順序決定了初始化的順序,變量定義散布于各個地方,仍然會在任何方法(包括構造方法)調用之前被初始化
???????????????????????????? final變量初始化有三種方式(1.在聲明final變量的時候 ;??? 2.在類的構造函數中 ;???? 3.在靜態(tài)代碼塊中)
???????????????????????????? >>> 訪問控制符和繼承一些需要注意的地方:
???????????????????????????????????? 1). 父類中聲明為public的方法在子類中也必須聲明為public;父類中聲明為protected的方法在子類中要么聲明為protected要么聲明為public,不可為private;父類中默認修飾符聲明的方法在子類中可以聲明為private;父類中聲明為private的方法不可被繼承
???????????????????????????????????? 2). 子類繼承父類初始化順序為??? >>> 在實例化子類是時,會首先執(zhí)行父類的初始化代碼塊(先靜態(tài)),實例變量的初始化
???????????????????????????????????????????????????????????????????????????????????????? >>> 執(zhí)行父類的構造函數
???????????????????????????????????????????????????????????????????????????????????????? >>> 子類的初始化代碼塊
???????????????????????????????????????????????????????????????????????????????????????? >>> 子類的構造函數
???????????????????????????????????? 4). 如果類還沒有被加載,那么子類通過類名加點的方式調用對象的時候,首先會執(zhí)行父類的靜態(tài)代碼塊和靜態(tài)變量,順序就是他們的出現順序,然后再執(zhí)行子類靜態(tài)代碼塊和靜態(tài)變量
???????????????????????????????????? 5).如果類已經被加載過了,那么靜態(tài)代碼塊和靜態(tài)變量就不會再次被執(zhí)行,再創(chuàng)建對象的時候只會執(zhí)行與實例相關的變量初始化和構造函數
????????????? Last:歡迎指正、交流
??????????????????????? 參考鏈接:--- 參考文獻直通車 ---
????????????????????????????????????????? --- 參考文獻直通車 ---
??????????????????????????????????????? 《JAVA思想編程第四版》