首先问一个问题,为什么要有访问控制权限?
安全,这当然是一个很重要的原因. 让类库的使用者只能接触他做需要接触的东西. 另外一方面,当我们去重构和修改代码的时候,如何不影响其他的代码和功能?权限访问控制是可以很好的将”变动的事物”和”不变的事物”区分开来.比如一个类库,在移除旧的实现添加新的实现的时候,很有可能会破坏客户端程序员的代码. 那么怎么办呢. 一个很好的思想就是,只暴露有必要的接口出去. 而屏蔽底层实现. 这些都是访问控制权限所需要做的事情.

简单来说,权限从大到小依次是,public,protected,default(包访问控制权限)和private.

包,package和import

同样的问题,为什么要有包?

  • 提供唯一的名字空间,通过package,可以构建一个全球唯一的类,不用考虑名称空间的冲突
  • 提供一种访问控制

通常的做法是将一些功能相似的类组织成一个package. package和import的作用就是将全局名字空间分割开来.

编译单元
一个.java的源文件通常被成为一个编译单元,一个编译单元内只能有一个public的类和0到任意个”非public”类. 其中public的这个类名字必须与文件名完全一毛一样.而其他非public的类,在这个package之外的世界是无法看到的. 它们的主要作用是用来为这个public类提供支持.

一个.java源文件”编译”后每个类都会生成一个.class文件. 按照编译型语言的剧本,之后这些中间文件会通过链接器或者类库产生器产生的其他同类文件捆绑在一起. 但是java不是编译型语言,所以java的做法是将这些.class文件打包成一个jar的文件. 运行的时候,由java解释器负责查找,装载和解释.

package创建规则
一个package不是将所打包的东西打包成一个单一的文件. 那么如何构建一个合理的package结构呢?java的做法是将package名字和.class文件的路径名字映射起来.
按照剧本,package名字的第一部分,是作者域名的反序书写. 比如我的域名是”thecatcher.net”(当然,由于当时租用的那个VPS性能太渣,这个网站已经挂掉了…) 那么我的包名称的第一部分就应该是net.thecatcher. 由于域名是全球唯一的,这一部分就已经保证了,你的package名称是独一无二的了. 第二部分就可以自定义了,爱啥啥. 映射到目录上,假设我有一个类net.thecatcher.demo.PackageDemo 那这个类的.class文件就应该存放在../net/thecatcher/demo/下

java解释器的运行过程

找环境变量中的CLASSPATH,并将CLASSPATH作为寻找的根目录,然后获取包名称,遇到.就转换成路径分隔符.以此作为类的路径去查找. 但是作为一个没有IDE连helloword都写不利索的水货,用eclipse的时候,这些事情就交给eclipse去处理了.

package和import
package没啥好说的,唯一需要注意的就是,这一语句必须出现在非注释行的第一行.
import有两个知识点:
第一,import static可以导入一个类中的所有静态成员(包括成员变量和成员方法),并合并到当前名称空间中.也就是说,可以少打几个字,直接调用方法就可以了,不需要再通过类名调用. 但是个人觉得,从代码可读性上说,这样并不好.
第二,可以通过import来改变代码的行为. java中没有条件编译,条件编译更多时候是为了平台移植. java不需要这个功能. 但是同时也失去了通过一个开关切换来产生不同行为的功能. 这时候有个好办法. 在debug的时候,两个类库功能一毛一样,但是一个是调试版一个是发布版. 可以在调用它的代码处通过更改package来进行切换.

比如,创建两个包,一个叫debug,一个叫debugoff. debug包中的代码包含一些可以显式发送一些消息到控制台,第二个没有这些东西. 那在调用这个类的类中,只需要通过切换不同的package就可以实现一键切换了.

权限修饰符

权限修饰符,public>protect>private

包访问权限
关键字default,但是一般不写的话默认就是包访问控制权限. 包访问控制权限允许将包内所有的相关类组合起来,使得他们可以轻松的访问. 包访问控制权限为把类聚集在一个包中的做法提供了意义和理由.

public:接口访问权限
为什么叫接口访问权限呢,想想也是,public的意义就是暴露出去给别人用,任何人都可以用. 正是接口的意义.

protected:继承访问权限
只有类内部和子类可以访问.

private
只有类内部可以访问.

接口和实现

访问控制权限的根本意义在于隐藏具体的实现,只暴露接口出去. 也就是所谓的封装. 访问控制权限将边界划在了数据类型的内部,限定客户端程序员可以使用和不可以使用的边界. 这样做是为了底层的安全. 另外以方便,将接口和具体实现相分离. 对上层调用来说,实现了底层无关.

类的访问权限控制

上面说的这些访问控制权限都是对类成员而言的. 而类也是有访问控制权限的. 类的访问权限修饰符只能是public或者default. 首先private是没有意义的. 给类上一个private,只有类内部可以访问,那要它干嘛? protected,类及子类可以访问. 如果继承了一个类,那么基类中的非private成员本来就是可以访问的. 那给它一个protected的权限同样没有意义.

那么如果想让一个类不能被随意的创建实例,可以通过私有化构造方法并且提供一个public的构建类实例的方法来实现. 比如单例模式.

TJI读书笔记09-访问控制权限的更多相关文章

  1. TJI读书笔记13-内部类

    TJI读书笔记13-内部类 TJI读书笔记13-内部类 创建内部类 内部类和外部类的关系 .this和.new 内部类和向上转型 局部内部类 匿名内部类 匿名内部类的定义和初始化 使用匿名内部类来实现 ...

  2. TJI读书笔记17-字符串

    TJI读书笔记17-字符串 不可变的String 重载”+”和StringBuilder toString()方法的一个坑 String上的操作 格式化输出 Formatter类 字符串操作可能是计算 ...

  3. TJI读书笔记16-异常处理

    TJI读书笔记16-异常处理 概念 基本异常情形 异常的捕获 自定义异常 异常说明 捕获所有异常 栈轨迹 重新抛出异常 Java标准异常 使用finally 异常的限制 构造器 异常的匹配 其他乱七八 ...

  4. TJI读书笔记10-复用类

    TJI读书笔记10-复用类 组合语法 继承语法 代理 final关键字 final的数据 final的参数 final的方法 final的类 初始化和类的加载 乱七八糟不知道怎么归类的知识点 代码复用 ...

  5. TJI读书笔记07-初始化

    TJI读书笔记07-初始化 成员初始化 构造方法初始化 初始化块 初始化的顺序 成员初始化 java尽量去保证每个变量在使用前都会得到初始化. 对于方法局部变量,java不会自动初始化他们,如果没有显 ...

  6. TJI读书笔记15-持有对象

    TJI读书笔记15-持有对象 总览 类型安全和泛型 Collection接口 添加元素 List 迭代器 LinkedList 栈 Set Map Queue Collection和Iterator ...

  7. TJI读书笔记14-闭包与回调

      TJI读书笔记14-闭包与回调 闭包与回调 为什么要使用内部类?内部类继承自某个类或者实现某个接口,内部类的代码可以操作外嵌类的对象. 这不是使用内部类的理由. 那么为什么使用内部类呢? 我觉得如 ...

  8. TJI读书笔记12-接口

    TJI读书笔记12-接口 抽象类和抽象方法 接口 完全解耦和策略模式 接口间的继承关系 工厂模式 乱七八糟不知道怎么归类的知识点 接口和抽象类为我们提供了更强又有力的接口和实现分离的方法. 抽象类和抽 ...

  9. TJI读书笔记11-多态

    TJI读书笔记11-多态 再说说向上转型 多态的原理 构造器和多态 协变返回类型 使用继承进行设计 多态是数据抽象和继承之后的第三种基本特征. 一句话说,多态分离了做什么和怎么做(再次对埃大爷佩服的五 ...

随机推荐

  1. HDU 1536 & 1944

    http://acm.hdu.edu.cn/showproblem.php?pid=1536 http://acm.hdu.edu.cn/showproblem.php?pid=1944 一样的题 题 ...

  2. kallisto:Near-optimal RNA-Seq quantification

    Near-optimal RNA-Seq quantification https://pachterlab.github.io/kallisto 文章标题:   Pseudoalignment fo ...

  3. JSBinding / About 2048 sample

    2048 Source 2048 source code is here: https://github.com/gabrielecirulli/2048 Play here!http://gabri ...

  4. gulp.js简单操作

    一.安装gulp 1.深入设置任务之前,需先安装gulp: $ npm install gulp -g 2.这会将gulp安装到全域环境下,让你可以存取gulp的CLI.接著,需要在本地端的专案进行安 ...

  5. nginx,php相关

    nginx安装 http://www.nginx.cn/install php安装 https://segmentfault.com/a/1190000004123048#articleHeader5 ...

  6. 【uTenux实验】任务管理

    任务就是一个无限循环.uTenux提供的任务管理功能是很强大的,包括建立和删除一个任务,启动或退出任务,取消一个任务的启动请求,改变任务的优先级和査询任务状态,使任务进人睡眠状态和唤醒状态,取消唤醒请 ...

  7. 写MYSQL存储过程遇到的一个小BUG

    DELIMITER $$ USE `income_new`$$ DROP PROCEDURE IF EXISTS `a`$$ CREATE DEFINER=`income_new`@`%` PROCE ...

  8. webpack +vue开发(1)

    首先安装 node.js这是毋庸置疑的,安装完了之后安装webpack npm install webpack -g 接下来创建一个自己的文件夹 webpack-learn在里面创建一个index.h ...

  9. vc6开发ActiveX并发布全攻略(三)(转)

    一.环境: windows xp sp3 Microsoft VC++ 6.0 二.制作文件 打开iexpress.exe(windows提供的一个向导式cab制作工具,位置:C:\WINDOWS\s ...

  10. OFBIZ:启动之StartupLoader

    任意一个JAVA程序都是从main()开始启动的,OFBIZ也不例外.OFBIZ的main()位于framework/start/src/org/ofbiz/base/start/Start.java ...