《 Java 编程思想》CH06 访问权限控制
- 访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。
- 重构即重写代码,以使得它更可读,更容易理解,并因此而更具维护性。
- 在面向对象设计中需要考虑一个基本问题:“如何把变动的事物与保持不变的事物区分开来”
- 应该尽可能将一切方法都定为
private
,而仅向客户端程序员公开你愿意让他们使用的方法。
包:库单元
- 包内包含有一组类,它们在单一的名字空间之下被组织在一起
- 为了解决潜在的名字冲突问题,Java使用 package 对名称空间进行完全控制并为每一个类创建唯一的标识符组合。
- 每一个编译单元(.java 文件)只能有一个 public 类。
- 当编译一个 Java 文件时,.java 文件中的每一个类都会生成一个与其类名相同的 .class 文件
- Java 可运行程序是一组可以打包并压缩为一个 Java 文档文件(JAR)的 .class 文件,Java解释器负责这些文件的查找、装载和解释。
- 类库实际上一组类文件。其中每个文件都有一个 public 类,以及任意数量的非 public 类。因此每个文件都有一个构件,如果希望他们都属于同一个群组,则可以使用关键词 package。
- package 语句必须是文件中除了注释外的第一行代码。如
packgae access;
表示当前文件是 access 类库的一部分,标识符为access.ClassName
; - package 名称的第一部分应该是域名的逆序。
- package 名称会被分解为一个目录路径,这个包的所有文件都应该放在该文件夹中,例如包名为
fun.wuxiaobai24.access
,则被解释成$CLASSPATH/fun/wuxiaobai24/access
,其中$CLASSPATH
为环境变量,CLASSPATH 可以指定多个目录。 - 在使用JAR文件时,需要在 CLASSPATH 中指明JAR文件的真实路径,如
CLASSPATH = .;~/jar/access.jar
- 如果将两个包含相同名称的类库用
*
形式导入时,在使用重名的类时,需要指明是那个包中的,如fun.wuxiaobai24.access.ClassName c = new fun.wuxiaobai24.access.ClassName()
- 使用
import static
语句进行静态导入,将某个包中的所有静态方法导入,这样可以直接用静态方法名进行方法调用,而不用在前面加类名,如调用某个类中的 main() 方法时,静态导入可以直接main();
,而普通的导入而需要ClassName.main();
- Java 中 没有 C 中的条件编译,但是可以用 import 来间接实现某些功能。
Java 访问权限修饰词
- 包访问权限允许将包内所有相关的类组合在一起,以使得它们彼此之间可以相互访问作用。
- 继承而来的类可以访问
public
和protected
,只有当两个类在同一个包中时才能访问包访问权限的成员。 - 对于OOP而言,提供访问器和变异器(getter/setter),以读取或改变数值是最优雅的方法,而是 JavaBean 的基本原理。
- 如果没有给文件指定包,Java 将这些文件视为该目录的默认包中,于是给该目录中所有其他的文件提供包访问权限。
- 不能因为在类中某个对象的引用是 private,就认为其他对象就不能拥有该对象。
- protected 成员除了继承的子类可以访问外,它也有包访问权限,即同一个包下的类可以访问它。
- private 可以用来实现单例子模式:
class Soup {
private Soup() {}
private static Soup soup = new Soup();
public static Soup access() {
return soup;
}
}
接口和实现
访问权限的控制常被称为具体实现的隐藏。把数据和方法包装进类中,以及具体的实现的隐藏,常共同被称为封装。其结果是一个同时带有特征和行为的数据类型。
访问权限控制将权限的边界划在数据类型的内部的原因:
- 不用担心客户端程序员偶然地将内部机制当作他们可以使用的接口的一部分。
- 接口和具体实现的分离
类的访问权限
为了控制类的访问权限,修饰词必须出现在关键词 class 之前,如public class ClassName
。同时有一些额外的限制:
- 每个编译单元(文件)都只能有一个 public 类。每个编译单元都有单一的公共接口,同 public 类实现
- public 类的名称必须与文件名相同,包括大小写。
- 编译单元(文件)中可以完全不带 public 类,此时可以随意对文件命名。
类的访问权限只有 public 和包访问权限。如果希望其他任何人对该类有访问权限,可以将所有的构造器都指定为 private,但是该类中 static 成员仍然可以创建和访问。
首发与Code & Fun
《 Java 编程思想》CH06 访问权限控制的更多相关文章
- Java编程思想之六访问权限控制
访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关. 访问权限控制的等级,从最大权限到最小权限依次为:public,protected,包访问权限(没有关键字)和private ...
- Java之封装与访问权限控制(二)
目录 Java之封装与访问权限控制(二) 包:库单元 import import static Java常用包 Java之封装与访问权限控制(二) 访问权限控制是具体实现的隐藏,是封装性的一部分体现. ...
- Java之封装与访问权限控制(一)
目录 Java之封装与访问权限控制(一) 封装的概念 访问控制符 属性私有化 Java之封装与访问权限控制(一) 对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来.我只能默默地 ...
- java基础-类成员访问权限控制
一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...
- Java编程思想:一个小小的控制框架
这个实验我很喜欢,学到了非常多的东西: import java.util.ArrayList; import java.util.List; public class Test { public st ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- JAVA笔记 -- 访问权限控制
访问权限控制 没有权限控制的时候,由于所有的接口都是可以访问的.当一个类库部分代码,发现有更好的方法解决的时候,可能其他接口会发生改动.这会导致另一个地方的引用该类库的程序发生崩溃.为了解决这种问题, ...
- JAVA编程思想——分析阅读
需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...
随机推荐
- 从两个角度理解为什么 JS 中没有函数重载
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表(参数个数.类型.顺序)的函数,这组函数被称为重载函数.重载函数通常用来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空 ...
- ObjectArx 使用消息钩子实现鼠标滚轮旋转实体
测试结果: 实现方法:主要是程序注册一个消息函数:func,拦截鼠标滚轮触发的消息,需要注意的是,以写的方式处理实体时需要锁定文档.注册func的主要方法是:BOOL acedRegisterFilt ...
- Python基础(二):操作基本数据类型
Python是一门解释型语言,它的优势在于代码简洁,易于理解,可以通过大量已封装好的内建方法和第三方模块方法完成日常所需的操作. 字符串 索引 起始下标为0 (从前往后数),末尾下标为-1(从后往前数 ...
- Nginx流量复制
1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...
- 17.python自定义模块的导入方式
1.直接用import导入 最后运行main.py可以看到命令行窗口输出了一句:你好,这样就完成了. 2.通过sys模块导入自定义模块的路径path 3.在环境变量中找到自定义模块 这个方法原理就是利 ...
- jenkins +git+ssh 构建 .net项目
jenkins +git+ssh 构建 .net项目 安装jenkins jdk 和插件就不一一介绍了. Multiple SCMs 插件介绍:可以获取多个项目(如果你的项目中有依赖其他项目的) So ...
- JS单元测试及原理
单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证,通过单元测试可以检测出潜在的bug,还可以快速反馈功能输出,验证代码是否达到预期,也可以保证代码重构的安全性. 有这样一个方法: let ...
- 记一次docker镜像导出导入流程
目标:导出测试环境的镜像到本地机器 过程: 测试机: docker save -o /Dockerfile/crontabService/php72.tar lnmp72:v1.4 压缩,要不文件太大 ...
- python基础操作以及变量运用
今天学习关于pycharm的操作以及变量的知识 1.关于pycharm的基本操作,作为一个小白,仪式感还是要有 在基础界面上新建然后打印hello world,也是对python的一种尊重吧 2.关于 ...
- Spring Boot2 系列教程 (十三) | 整合 MyBatis (XML 版)
前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,之前介绍过了 SpringBoot 整合MyBatis 注解版的使用,上一篇介绍过 MyBatis ...