摘要:
- 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