第6章-访问权限控制

时间:2022-07-27 09:58:43

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. 编译单元的特点

  1. 一个编译单元至多只能一个class是public的(也可以一个都没有),且这个public的class必须和文件完全同名,大小写都要保持一致。
  2. 一个编译单元可以有数量不受限的默认(不带任何修饰符)的class,用来为这个编译单元中的public那个class提供支持。

假设存在一个Demo.java文件,里面写的代码可以有这几种场景。

  1. 仅有一个public的class。
public class Demo{}
  1. 还拥有不带修饰符的class。
public class Demo{}
class Helper{}
class Utils{}
  1. 只有不带修饰符的class(一般用不到,此时对文件名不做要求)。
class Helper{}
class Utils{}

3.类上不同的修饰符对访问权限影响

2.2列出了所有可能的加在class前的修饰符,要么是public的,要么是默认啥也没有,他们之间的区别在于。

  1. public修饰的类,那里都能访问。
  2. 默认啥也不带的,也成为包访问权限,只能是在处于同一个包下的类才能访问这个类。

如果啥也不带,那么如果这个类位于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 × × × × ×