摘要:
- private:僅僅針對類定義時,可以調用;(類作者保護機制)
- protected:在外部包中,無法調用*;(包作者保護機制)
- public:接口。(庫用戶的使用接口)
- 除了public外,外部包能訪問的唯一途徑:protected,且只能是在外包的子類定義時生成子類的對象,然後調用protected.
- default,約等於protected,唯一區別在於:default沒有外包訪問的唯一途徑
-----------------------------------------------------------------------------------------------------------------------------------
細節:
1、同一編譯單元內:
a、該類定義中,public、protected,以及private 均可以自由調用;
b、該類生成的對象,僅可以調用public、protected;
c、繼承類的定義中,僅可以調用public、protected;
d、繼承類生成的對象,僅可以調用public、protected;
2、同一包內:
a、不必通過import來導入,可以直接使用。
b、在類定義的同一包內,其它編譯單元可以生成類(包括基類、子類)的對象,並調用public、protected數據和方法(包括子類調用基類的數據和方法),但不能調用private。如同1b。
3、不同包內:
a、導入方法:
import pakgeName.*;
或者具體到類所在的編譯單元:
import pakgeName.className1;import pakgeName.className2;
b、
b1、類必須是public,否則其它單元中將不可見。
b2、每個類必須單獨佔有一個編譯單元,文件名等於類名。
b3、類中允許有main函數,main()可以無參,可以不是static。
c、對於在其他編譯單元中生成的類的對象,僅public變量和方法能被調用;
備註:每個編譯單元只能有一個public類(p121),因此無法將多個類定義在同一編譯單元中,卻提供給其他包中的類調用。
表格總結:
訪問權限總結 | ||||
public | protected | default | private | |
類的定義 | Y | Y | Y | Y |
同一編譯單元中類生成的對象 | Y | Y | Y | N |
子類生成的對象對基類方法/數據的調用 | Y | 本包Y/外部包N | 本包Y/外部包N | N |
本包 | Y | Y | Y | N |
外部包 | Y | N* | N | N |
*:在子類定義中,在各函數/方法中生成的該子類的對象,該對象可以(Y)調用基類的protected數據/方法(default不行)
但是對與非子類定義,即根據類生成對象時,protected/default是不可以(N)調用的。
附:其它該主題的博客
https://blog.csdn.net/u013771764/article/details/81226908