[Java编程思想] 第六章 访问权限控制

第六章 访问权限控制

6.1 包:库单元

  包内含有一组类,它们在单一的名字空间之下被组织在了一起。

  当编写一个Java源代码文件时,此文件通常被称为编译单元。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件名称相同,包括大小写,但不包括后缀名.java。每个编译单元必须只能有一个public类,否则编译器就不会接受。如果在该编译单元之外还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要为主public类提供支持。

  如果希望这些构件从属同一个群组,可以使用关键字package,且必须在除注释外的第一行。如果想在其它地方使用群组中的任意public类,需要import导入。

  package和import要做的就是将单一的全局名字分割开,无论多少人使用都不会出现名称冲突。

6.2 Java访问权限修饰词

6.2.1 包访问权限

  默认访问权限没有任何关键字(有时也表示为friendly),但通常是指包访问权限。当前包内所有类对该成员都有访问权限,但包外的类看来,该成员是private。

  取得对某成员的访问唯一途径是:

  1. 使该成员成为public
  2. 通过不加访问权限修饰词并放置于同一包内。
  3. 通过继承而来的类,可以访问public和protected成员,但private不行。(protected和包权限在同一包中相同,但在包外继承时只有关键字protected和public才能访问)
  4. 提供访问器和变异器(也称get/set方法),对OOP而言,这是最优雅的方式,也是JavaBean的原理。

6.2.2 public:接口访问权限

6.2.3 private:你无法访问

6.2.4 protected:继承访问权限

  1. 父类的protected成员包内可见,并且对子类可见。
  2. 若子类与父类不在同一包中,那么在子类中,子类实例可访问从父类继承的protected方法,而不能访问父类实例调用的protected方法。
            类内部 本包 子类  外部包 
 public       √    √   √    √
 protected    √    √   √    ×
 default      √    √   ×    ×
 private      √    ×   ×    ×

6.3 类的访问权限

请注意,类既不可以是private的(这样会使得除该类外,其他任何类都不可以访问它),也不可以是protected的。(事实上,一个内部类可以是private或protected的,但那是一个特例)

protected继承访问权限,是⽤来修饰类中的属性和⽅法的,不是⽤来修饰类的。假如定义⼀个A类⽤protected修饰,再在与A类不同包的另⼀个包中定义⼀个B类,B类如果要继承A类,前提是B类能够访问到A类。仔细想想就会发现这是冲突的。(你要成为A类的⼦类,你的先访问到A类,但你要访问到A类,那你先得成为A类的⼦类。因为protected修饰的类就是给⼦类访问的)这个逻辑明显是冲突的。

  1. 每个编译单元(文件)都只能有一个public类。
  2. public类的名称必须完全与含有该编译单元的文件名相同。
  3. 虽然不常用,但编译单元内完全不带public类也是可能的。
  4. 所以对于类的访问权限,仅有两个选择:包访问权限或public。
posted @ 2022-03-22 20:19  蔚然丶丶  阅读(66)  评论(0编辑  收藏  举报