一、Java中有四種訪問權限,private、default(一般省略)、public、protected。
- private: Java語言中對訪問權限限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能允許跨包訪問。
- default:即不加任何訪問修飾符,通常稱為“默認訪問權限“或者“包訪問權限”。該模式下,只允許在同一個包中進行訪問。
- protected: 介于public 和 private 之間的一種訪問修飾符,一般稱之為“保護訪問權限”。被其修飾的屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
- public: Java語言中訪問限制最寬的修飾符,一般稱之為“公共的”。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包訪問。
這里需要注意的是,所謂的訪問,可以分為兩種不同方式:第一,通過對象實例訪問;第二,直接訪問。
比如說,某父類protected權限的成員,子類是可以直接訪問的,換一種說話是子類其實繼承了父類的除了private成員外的所有成員,包括protected成員,所以與其說是子類訪問了父類的protected成員,不如說子類訪問了自己的從父類繼承來的protected成員。另一方面,如果該子類與父類不在同一個包里,那么通過父類的對象實例是不能訪問父類的protected成員的。
二、下面用表格來展示四種修飾符的訪問權限范圍:
權限 | 類內 | 同包 | 不同包子類 | 不同包非子類 |
---|---|---|---|---|
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
三、舉個栗子
在Eclipse中新建個類,四個類的結構如下,Aclass 和Bclass 是同包的類,Cclass 和Dclass是同包的類,Cclass 繼承了Aclass。
Aclass類的定義如下,有四個成員變量,權限分別為private、default、protected、public。四個成員方法,權限分別為 private、default、protected、public。
Bclass類定義如下,它和Aclass類同屬于 test1包 ,在里面定義了一個成員方法show(),該方法通過兩種方法對Aclass類的所有成員進行了訪問,第一方法通過實例化一個Aclass類對象aa對成員變量及方法進行訪問,第二種是直接訪問Aclass中的成員。通過IDE的自動檢測報錯,可以看出,Bclass類是不能直接訪問Aclass類的成員的,但通過對象的方法可以訪問default權限以下(default、protected、public)的成員。
Cclass類定義如下,它和Aclass類屬于不同的包,但是Cclass繼承了Aclass ,在里面定義了一個成員方法show(),該方法同樣通過兩種方法對Aclass類的所有成員進行了訪問,第一方法通過實例化一個Aclass類對象aa對成員變量及方法進行訪問,第二種是直接訪問Aclass中的成員。通過IDE的自動檢測報錯,可以看出,Cclass類是可以直接訪問Aclass類權限為protected、public的成員(因為子類的緣故),但通過對象的方法只能訪問 public權限的成員(因為Cclass和Aclass不同包)。
Dclass類定義如下,它是Aclass類不同包的一般類,在里面定義了一個成員方法show(),該方法同樣通過兩種方法對Aclass類的所有成員進行了訪問,第一方法通過實例化一個Aclass類對象aa對成員變量及方法進行訪問,第二種是直接訪問Aclass中的成員。通過IDE的自動檢測報錯,可以看出,Dclass類是不可以直接訪問Aclass類的成員(因為不是子類的緣故),但通過對象的方法只能訪問 public權限的成員(因為class和Aclass不同包)。
四、總結語
以上栗子,對JAVA語言種4種訪問權限做了簡單的探討,這就是我對它們的理解。