think in java 读书笔记 第6章-访问权限控制
1.什么是访问权限控制
都知道JAVA应用是由多个不同的类相互配合调用来实现一系列功能的,那我现在有类A,类B两个类,其中类B有很多方法和属性,通过对类B及其方法和属性设置不同的关键字,使得类A只能使用类B中特定关键字修饰的方法和属性,这就是访问权限控制
2.如何实现访问权限控制
想要知道如何实现权限控制,要知道一些概念:编译单元和一些特殊关键字public private protected等。
2.1. 什么是编译单元
都知道JAVA代码都是.java这样格式的文件,经过javac编译之后才能编程成.class这种机器可以识别的机器码。这样的一个*.java文件就是一个编译单元。
2.2. 编译单元的特点
- 一个编译单元至多只能一个class是public的(也可以一个都没有),且这个public的class必须和文件完全同名,大小写都要保持一致。
- 一个编译单元可以有数量不受限的默认(不带任何修饰符)的class,用来为这个编译单元中的public那个class提供支持。
假设存在一个Demo.java文件,里面写的代码可以有这几种场景。
- 仅有一个public的class。
public class Demo{}
- 还拥有不带修饰符的class。
public class Demo{}
class Helper{}
class Utils{}
- 只有不带修饰符的class(一般用不到,此时对文件名不做要求)。
class Helper{}
class Utils{}
3.类上不同的修饰符对访问权限影响
2.2列出了所有可能的加在class前的修饰符,要么是public的,要么是默认啥也没有,他们之间的区别在于。
- public修饰的类,那里都能访问。
- 默认啥也不带的,也成为包访问权限,只能是在处于同一个包下的类才能访问这个类。
如果啥也不带,那么如果这个类位于com.pikzas包下,其他处于相同路径下的类中可以访问那些不带修饰符的class,可以new Helper();而且能够正确的编译,但是如果一个类位于com.alex或者com或者com.pikzas.inner这些路径下,则在这些类中new Helper();这样的操作会提示编译错误,因为此时不具有访问权限。
4.属性和方法上不同的修饰符对访问权限的影响
4.0.访问权限范围由小到大分别是
只能自己这个类中使用 < 同一个包类路径下、不同的类中可以使用 < 任意位置的任意类中都可以使用
分别对应的关键字是 private、default、public
4.1.public 修饰的属性或者方法,只要能访问到这个类,那么这个方法或者属性都可以访问
4.2.private 修饰的属性或者方法,只有这个类自己才能访问(就算是在同一个编译单元内的不同class内也不能访问)
4.3.default 默认包访问权限 就是什么关键字也没有加 修饰的属性或者方法,只要是与当前类位于同包类路径下,都具有访问权限。
4.4.protected 这个关键字的出现主要是为了解决继承带来的访问权限问题,想要让子类有权限访问(private只能父类自己访问),但不想让所有人都能访问(public所有人都能访问)。父类中protected修饰的属性或者方法对于子类是可见的,同时兼具protected的特性(同包类路径下的其他类也可以访问)
4.5.访问关系图
关键字 | 类内部 | 同编译单元内部其他类 | 同包类路径下的子类 | 不同包类路径下的子类 | 同包类路径下其他类(包含同编译单元不同类) | 不同包类路径下的类 |
---|---|---|---|---|---|---|
public | √ | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | √ | × |
default | √ | √ | √ | × | √ | × |
private | √ | × | × | × | × | × |