一:为什么需要权限控制
控制对类的成员的访问权限控制有两个原因:
1、为了使用户不会触碰他们不应该触碰到的不分,这部分对于类内部的操作是必要的,但是他们并不属于客户端程序员所需接口的一部分。
2、是为了让类库设计者可以更改类的内部的工作方式,而不必担心这样做会对客户端程序员长生重大的影响。
现在抛出一个问题:
我们的程序员再开发完代码之后,发现我们写的代码有更好的实现方式,但是之前写的代码已经有其他用户所使用,现在的问题是,我们如何在不让用户改变他们的代码的同时又能优化我们的代码呢?
解决方案
为了解决上述问题,java提供了访问权限修饰词供类库开发人员向客户端程序员指明代码的哪些部分是可以使用的,哪些部分是不能使用的。
二:修饰词介绍
为此,java提供了三个修饰词public、protected、private。但是实际上却又四种访问权限,因为程序员可以不指定任何一种权限方式,也就是默认的情况。
下表是四种方式的访问权限表:
No. | 范围 | private | default | protected | public |
---|---|---|---|---|---|
1 | 在同一个类中 | √ | √ | √ | √ |
2 | 在同一包的不同类 | √ | √ | √ | |
3 | 在不同包的子类 | √ | √ | ||
4 | 在不同包的非子类 | √ |
三:小结
public :
特点: 具有最大的访问控制权限,任何在CLASSPATH路径下的都可以访问。
作用: 两个类之间数据的传递,方便使用,调用
protected :
特点: 子类【当前包,不同包】,当前包内,可以直接访问
作用: 方便父类与子类的数据传递,或者是方便与当前包中的类的数据的传递
default 【friendly】:
特点:本包中可以访问,不同包的限制访问
作用:方便本包数据的传递
private :
特点:类的内部可以直接访问,别的不行
作用:封装性,不能被外部直接访问
注意:Java的访问控制在编译的时候查错,使用反射,没有访问控制的限制。
注意:
1、每一个编译单元只能有一个public类
2、public类的名称必须完全和含有该编译单元的的文件名相匹配、
3、一个类不能是private也不能是protected的。只能是public或者是默认权限的。
4、如果一个类的所有构造方法都变成了private,那么不能直接创建该类的对象,但是可以通过单例模式来创建。