《 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表达式使用 设计能力.领 ...
随机推荐
- 机器学习之路--Numpy
常用代码 ndarray.dtype 数据类型必须是一样的 常用代码 import numpy #numpy读取文件 world_alcohol = numpy.genfromtxt("wo ...
- Spring Boot 添加Druid连接池(1.5 版本)
Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,地址:https://github.com/alibaba/druid .Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据 ...
- vue-cli3 中 sockjs-node/info?t=报错 的解决方法
页面突然出现这种报错: 查看Network看到是info接口报错,我项目中没有调用过该项目,然后百度查询sockjs-node/info?t=1562204191563, 首先 sockjs-node ...
- 利用log4net创建日志文件时过滤日志,这是坑还是?
前言 网上貌似没有太多关于log4net过滤日志的资料,在研究过程中发现一点小问题,这里做下记录,希望对后续有用到的童鞋起到一丢丢帮助作用. log4net日志过滤 由于是在.NET Core中使用, ...
- spring boot中使用freemarker
在做Java web开发领域,web模板引擎主要有jsp.freemarker.velocity,其中freemarker是我们常用的一种,在spring boot中使用的freemarker的方法可 ...
- CAS的实现原理
CAS的全称是CompareAndSwap,比较并交换,是Java保证原子性的一种重要方法,也是一种乐观锁的实现方式. 它需要先提前一步获取旧值,然后进入此方法比较当下的值是否与旧值相同,如果相同,则 ...
- 在GeneXus开发过程中如何进行自动化测试?
1. 简介 GXtest是基于专门为GeneXus平台开发的应用程序提供的自动化测试解决方案. 我们强调“解决方案”和“自动化”两个词: 解决方案:GXtest为整个GeneXus软件开发生命周期提供 ...
- acmPush模块示例demo
感谢论坛版主 马浩川 的分享. 模块介绍: 阿里移动推送(Alibaba Cloud Mobile Push)是基于大数据的移动智能推送服务,帮助App快速集成移动推送的功能,在实现高效.精确.实时 ...
- JVM中的GC算法,JVM参数,垃圾收集器分类
一.在JVM中什么是垃圾?如何判断一个对象是否可被回收?哪些对象可以作为GC Roots的根 垃圾就是在内存中已经不再被使用到的空间就是垃圾. 1.引用计数法: 内部使用一个计数器,当有对象被引用+1 ...
- git 其它补充(版本)
1.给源码贡献力量(当自己比较牛逼时) pull request 2..gitignore文件 在创建仓库的时候可以进行设置 3.版本 git tag -a v1.0 -m '版本介绍' 本地创建Ta ...