1 包
解决了同名Class共存的问题,例如Apache的CommonUtil就经常会和自己创建的CommonUtil冲突。包的概念类似框架里的命名空间(namespace)。它为类分组,以包为单位,其中的所有Class为一组,对外隔离,既从物理上分组又从逻辑语义上进行分组,对代码的管理起到一定作用。
2 访问权修饰词
一般认为有public、protected、private(如果不写默认还有一个叫做default或friendly,也叫作包访问权限)。
friendly/default(包)访问权限:允许将包内所有相关类组合起来,当前包就是一个整体。
public访问权限:public声明的成员声明自己对每个人都是可以访问的。
private访问权限:除了包含该成员的类之外,其它任何类都无法访问这个成员。例如单例模式,getInstance调用本地构造器,但是构造器私有,外部无法访问。
protected访问权限:两个不同的包,子类继承父类,子类只能使用父类的public成员,有时父类希望将部分成员的访问权限赋予子类,但又不想给其它类。(同一个包内,protected修饰的成员是可以互相访问的)。
访问权限 | 当前类 | 同包类 | 子类 | 非子类&&外包类 |
---|---|---|---|---|
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
default/friendly | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
修饰符将“代码提供者”和“代码消费者”隔离开,通过对类成员进行修饰,能达到控制 “代码消费者” 权限的目的。例如“代码消费者”调用一个public方法,此方法的实现是由一个private方式完成,调用方不能也不需要知道 “代码提供者”具体做了什么,这样也方便 “代码提供者”随时修改private的实现。同时也能有效防止“代码消费者”对成员变量的任意修改。
3 接口和实现
把成员方法和成员变量封装成类之后,供其他人调用。当需要将访问权限划分到此类外部的时候,就可以让此类实现一个接口,调用者直接向接口发送消息,避免了与类的直接交互。因此,推测接口(interface)中的方法一般都是public修饰,是不是因为它只是一个抽象层,可以放心大胆的让别人调用,而又不用担心数据安全呢?
总结:访问权限控制,有点类似于程序设计时的“系统边界”(https://blog.csdn.net/nickDaDa/article/details/89631664),可以将类之间的关系看作子系统之间的关系,每个子系统都有自己的系统边界,如果是这样是不是也可以把访问修饰符称作“Coding Border”。