1. 程式人生 > >Java Grammar(三):修飾符

Java Grammar(三):修飾符

### 簡介 修飾符是用於限定型別以及型別成員申明的一種符號,從修飾物件上可以分為類修飾符,方法修飾符,變數修飾符;從功能上可以劃分為訪問控制修飾符和非訪問修飾符。訪問修飾符控制訪問許可權,不同的訪問修飾符有不同的許可權範圍,而非訪問修飾符則是提供一些特有功能。 ![image-20190812210957757](http://viyoungblog.oss-cn-beijing.aliyuncs.com/2019-08-12-130958.png) 下面我們從功能的角度分別講解修飾符 ### 訪問修飾符 訪問修飾符有四種:`public`,`private`,`protected`,`default`。這裡需要注意,我們這裡的`default`和非訪問修飾符中的`default`可不是一個東西! 這裡的`default`指的是預設,**什麼也不寫**,在同一包內可見,不使用任何修飾符。使用物件:**類、介面、變數、方法**。 `private`指的是在僅僅在類內可見,所以也就很好理解,`private`只能修飾**方法,變數**,而不能修飾類和介面(畢竟你只能類內訪問,你修飾類誰能看得到呢?),修飾方法的時候,一般用於我們在重構程式碼的時候提取公用程式碼為**內部實現方法**,修飾變數的情景相比我們就經常見到了,由於Java的**封裝**特性,我們在定義一個類的時候,經常會把該類的屬性定義為`private`,通過`get`or`set`方法來訪問這些變數。 而`public`在我們日常中使用的比較多,我們經常會把類宣告為`public`,宣告成`public`的**類,介面,變數,方法**可以被任何類訪問,這裡需要注意一個java檔案中只能包含一個`public`的類,而且`main`方法必須用`public`修飾,否則無法被Java的直譯器識別。 `protected`我們在日常的開發中使用不多,只能宣告在**變數,方法,內部類**上,它主要的作用就是用來**保護子類**的。它的含義在於子類可以用它修飾的成員,其他的不可以,它相當於傳遞給子類的一種**繼承**的東西。 - 基類的 `protected` 成員是包內可見的,並且**對子類可見**; - 若子類與基類不在同一包中,那麼在子類中,子類例項**可以訪問**其從**基類繼承而來**的`protected`方法,而**不能訪問基類例項**的`protected`方法。 ![image-20190812221038073](http://viyoungblog.oss-cn-beijing.aliyuncs.com/2019-08-12-141038.png) ⬆ 大概就是上圖醬紫,湊合著看,畫圖功力賊差:) ### 非訪問修飾符 #### default 這裡的`default`是jdk 8中的新特性,指的是介面方法的預設實現,在JDK 8 之前介面的方法是不能有實現的,而JDK 8 後`default`修飾的方法可以在介面中進行預設的實現: ```java public interface Test { default void hello(){ System.out.println("Hello"); } } ``` 就像醬紫~ #### static static是面試的一個**熱點**,static的意思是靜態,可用於修飾變數和方法,切記一點,static是屬於**類**的,而非是屬於物件的,static關鍵字修飾的方法或者變數不需要依賴於物件來進行訪問,只要類被載入了,就可以通過**類名**去進行訪問。 而static關鍵字的基本作用就是:方便在沒有建立物件的情況下來進行呼叫(方法/變數)。 這裡需要注意,由於static修飾的方法和變數是屬於類的,不需要依靠物件才能使用,所以他不能訪問非static修飾的方法和變數,因為這些變數和方法是必須依託於物件才能訪問!但是**非static的方法可以訪問static的方法或變數**,因為當你建立物件的時候,類必定已經載入,所以可以訪問的到。 這裡需要注意一點:static不可修飾區域性變數 #### final `final`關鍵字我們在日常中也會經常用到,通常用的最多的場景就是搭配`static`一起來使用去定義我們系統的常量: ```java public static final String AUTHOR = "viyoung" ``` 除了修飾變數,還可以用於修飾類和方法,被final修飾的類無法被繼承,**被final修飾的方法可以被繼承,但是無法進行修改**。 #### abstract `abstract`可以作用在類和方法上,當作用在類上時,說明這個類是一個抽象類,需要去繼承擴充套件,無法直接例項化一個物件,當作用在方法上的時候,說明這個方法需要擴充套件,被`abstract`修飾的方法以分號結尾,沒有實現,而且無法被`final`和`static`修飾(一個需要被繼承且沒有實現的方法為毛要用這倆修飾,不是自己打自己臉嗎