第6章 访问权限控制

第6章 访问权限控制

标签(空格分隔): 访问权限 Java编程思想

  • 第6章 访问权限控制
    • 包库单元
      • 1 代码组织
      • 2 创建独一无二的包名
      • 3 对使用包的忠告
    • Java访问权限控制修饰词
      • 1 包访问权限
      • 2 public接口访问权限
      • 3 private你无法访问
      • 4 protected继承访问权限
    • 类的访问权限


访问控制权限(或隐藏具体实现)与“最初的实现并不恰当”有关。
访问控制权限的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)和private。

1. 包:库单元

包内包含一组类:它们在单一的名字空间之下被组织在了一起。
当编写一个Java源文件时,此文件通常被称为编译单元(有时被称为转译单元)。每个编译单元只能有一个public类,否则编译器就不会接受,如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看到这些类的,这是因为它们不是public类,而且他们主要用来为主public类提供支持。

1.1 代码组织

Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR,使用Java的jar文档生成器)的.class文件。其中每个文件都有一个public类,以及任意数量的非public类。因此每个文件都有一个构件。如果希望这些构件(每一个都有它们自己的独立的.java和.class文件)从属于同一个群组,就可以使用关键字package。使用package语句,它必须是文件中除注释以为的第一句程序代码。

1.2 创建独一无二的包名

按照惯例,package名称的第一部分是类的创建者的反顺序的Internet域名。

Java解释器的运行过程如下:首先,找出环境变量CLASSPATH。CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称。得到的路径与CLASSPATH中的各个不同的项相连接,解释器就在这些目录中查找与你所要创建的类名称相关的.class文件。

使用JAR文件时会有变化。必须在类路径中将JAR文件的实际名称写清楚,而不仅是指明它所在位置的目录。
CLASSPATH=.;D:\JAVA\LIB;C:\flavors\grape.jar
javac Hello.java -d .\
java com.test.Hello

1.3 对使用包的忠告

务必记住,无论何时创建包,都已经在给定包的名称的时候隐含地指定了目录结构。这个包必须位于其名称所指定的目录之中,而该目录必须是以CLASSPATH。

注意:编译过的代码通常放置在与源代码不同目录中,但是必须保证JVM使用CLASSPATH可以找到该路径。

2. Java访问权限控制修饰词

public、protected和private这几个Java访问权限修饰词在使用时,置于类中每个成员的定义之前—无论它是一个域还是一个方法。每个访问权限修饰词仅控制它所修饰的特定定义的访问权。
如果不提供任何访问权限修饰词,则意味着它是“包访问权限”。

2.1 包访问权限

默认访问权限没有任何关键字,但通常是指包访问权限。这就意味着当前包中所以其他类对那个成员都有访问权限,但是对于包外的所有类,这个成员却是private。

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

  • 使该成员成为public。无论是谁,无论在哪里,都可以访问该成员。
  • 通过不加访问权限修饰词并将其他类放置于同一个包内的方式给成员赋予包访问权限。包内其他类就可以访问该成员了。
  • 继承而来的类既可以访问public成员也可以访问protected成员(但不能访问private成员)。只有在两个类都处于同一个包内时,它才可以访问包访问权限的成员。
  • 提供访问器(accessor)和变异器(mutator)方法(get/set方法)。

2.2 public:接口访问权限

使用public关键字,public修饰的成员对每个人都是可以使用的。

2.3 private:你无法访问

关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
任何可以肯定只是该类的一个“助手”的方法,都可以把它指定为private,以确保不会在包内的其他地方误用它,就防止了你会去改变或删除这个方法。

2.4 protected:继承访问权限

如果创建了一个新包,并自另一个包中继承类,那么唯一可以访问的成员就是源包的public成员。(当然,如果在同一个包内执行继承操作,就可以操纵所有的拥有包访问权限的成员。)
有时,基类的创建者希望有某个特定成员,把对它的访问权限赋予派生类而不是所有类。这就需要protected来完成这一工作。protected也提供了包访问权限,也就是说,相同包内的其他类可以访问protected元素。

3. 类的访问权限

类既不可以使private的,也不可以是protected的。所以对于类的访问权限,仅有两种选择:包访问权限或public。如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象,但有一个例外,就是你在该类的static成员内部可以创建。

class Soup1{
    private Soup1(){}
    //(1)Allow creation via static method
    public static Soup1 makeSoup(){
        return new Soup1();
    }
}

class Soup2{
    private Soup2(){}
    //(2)Create a static object and return a reference 
    //upon request(The "Singleton" pattern)
    private static Soup2 ps1=new Soup2();
    public static Soup2 access(){
        return ps1;
    }
    public void f(){}
}

public class Lunch{
     
    void testPrivate(){
        //Can't do this!Private constructor
        //Soup1 soup=new Soup1();
    }

    void testStatic(){
        Soup1 soup=Soup1.makeSoup();
    }

    void testSingleton(){
        Soup2.access.f();
    }
}

如果没能为类访问权限指定一个访问修饰符,它就会默认得到包访问权限。这就意味着该类的对象可以由包内任何其他类来创建,但在包外则是不行的。(一定要记住,相同目录下所有不具有明确package声明的文件,都被视作该目录下默认包的一部分。)

你可能感兴趣的:(Java编程思想读书笔记,访问权限控制,Java编程思想,Java)