第六章:访问权限控制

来源:互联网 发布:华为手机数据恢复 编辑:程序博客网 时间:2024/06/18 08:33

访问权限控制

  • 程序是会被不断改进的,如果程序开发者想要移除旧的实现而要添加新的实现时,改动任何一个成员都有可能破坏客户端程序员的代码。那么类库开发者就会束手束脚,无法对任何事物进行改动。
  • 为了解决这个问题,Java提供了访问权限修饰符,以供类库开发人员向客户端程序员指明哪些是可用的、哪些是不可用的。访问权限控制的等级从最大到最小权限依次为:publicprotected包访问权限(没有关键词)和private。经验来说,尽可能地让方法定义成私有的(private),而仅公开那些愿意被客户端程序员调用的方法。
  • 还有一个重要的概念是如何将类库构件置于包中,Java中通过package加以控制,后面细说。

包:库单元

  • 包内包含了一组类,它们在单一的名字空间之下被组织在了一起。
  • 举个不恰当的例子。比如说有两个班级,班级中的学生可以认为是一个个类,班级可以认为是一个包。那么就必然有一种需求:同班同学之间可以互帮互助而不需要过多阻碍(无需import引入即可使用)。如果想去“结交”其他班级的同学则需要得知其他班级的地址(import引入),另外其他班级同学和你不熟,也可能不会把知识分享给你(无法调用包访问权限声明的方法)。
  • 引入这种的机制还能解决一些问题。例如两个班级的人中都有叫小明(类名)的学生(先排除一个班级内有两个学生叫小明,这是不被允许的)。那么教导主任要表扬某位学生,只说小明是没有用的。他必须带上班级才能加以分辨。同样的,如果没有这种包的机制,类的管理会相当混乱。
  • 我们通过package可以将类构件分配到相应的包中,实际开发中必须与文件夹路径一致(因为打包这种行为不是组成一个文件,而是生成多个class文件,还得利用文件路径去区别)。

代码组织

  • 我们都知道文件*.java的文件名必须与public类的类名相同,另外还可以拥有若干的非public类(Test2就像一个小组长,Test3和Test4是组员,他们在班级中的地位是一致的(在包下都可以被引用)。但是出了这个班级,在别的班级中只有组长允许被调用。(因为人家是public的呀,不同包下不能访问非public类):
//Test2.javapublic class Test2 {}class Test3 {}class Test4 {   }

关于classpath

  • 学过java的都知道,刚装完jdk以后要配置环境变量,才能在cmd中用javac命令去编译java文件,和用java命令去执行class文件。关于path,这个一般是命令的查找路径。如果没有设置这个路径,我们就无法使用java和javac等等命令。而classpath则是和包的概念有关。
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;//.;是当前目录
  • 这个是我机器上的classpath。JAVA_HOME只是一个用户变量,存的是jdk的路径,这个相信大家都明白。那么classpath具体有什么用呢。简单来说,就是当编译器遇到import某个类是,它就会以classpath为前缀(如果是jar文件,则需指明完整路径),加上import后面的路径去定位要引入的文件路径。例如我们要import java.util.ArrayList; 那其实是从rt.jar(这个文件是在jre里面的,如果使用javac等命令,会自动加载里面的jar包)中读取了ArryaList;举个例子,比如我们写了一个工具包(hello-util.jar)。如果我们想在其他地方可以随意引用这个工具包,可以直接在相应java文件中import工具包对应的包路径。然后为classpath增加hello-util.jar的绝对路径即可。
  • 当我们的java文件带有package时,在java命令这个文件时,也必须带上包路径。
//比如D盘里有个your文件夹,该文件下有个Test.java文件package your;public class Test {    public static void main(String[] args) {        System.out.println("成功执行了");    }}

这里写图片描述

Java访问权限修饰符

  1. 包访问权限:当前包中的所有其他类对这个成员都有访问权限,但对于这个包之外的所有类,这个成员却是private。都没有指定package的相同文件夹下的文件同处于一个默认包(可以访问对方的友好变量)。
  2. protected:继承访问权限。除了同包下的可以互相访问以外,还支持子类访问父类的protected变量和方法(哪怕不是同包下的)。
  3. private:只有类内部能访问。
  4. public:哪里都可以访问。

    • 注意这个位置是指这个类是在哪个类中创建的。比如A类中有一个private变量,那么在B类创建的A实例成员(或者某个方法中的局部变量)就没办法访问private变量。而对于友好变量,则是指B类和A类是不是在同一个包下,以此类推。

类的访问权限

  • 如果希望某个类可以为某个客户端程序调用,就可以用public作用于整个类的定义来达到目的。
public class Hello{}
  • 有以下几点需要注意:
    1. 每个编译单元(文件)都只能有一个public类。
    2. public类的名称必须完全和文件名相同。
    3. 虽然不是很常见,但是java文件可以没有public类,此时文件名可以随便取。
    4. 非public类只能被同包下调用。