`
凌紫冥
  • 浏览: 24520 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java编程思想第四版——第十八天

    博客分类:
  • Java
 
阅读更多
2012-04-27
142-149/913

Java编程思想第四版——第十八天

第6章 访问权限控制
访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。
重构即重写代码,以使得它更可读、更易理解,并因此而更具可维护性。
面向对象设计中需要考虑的一个基本问题:如何把变动的事物与保持不变的事物区分开来。
访问权限从最大到最小:public、protected、包访问权限(没有关键词)、private。
C语言访问事物不受任何限制。
访问权限因类是存在于一个相同的包,还是存在于一个单独的包而受到影响。
理解访问权限修饰词的全部含义,要学习如何将类库构件置于包中。

6.1 包:库单元
包内包含有一组类,它们在单一的名字空间之下被组织在了一起。
使用全名使程序变得冗长,可以使用import关键字导入类。使用*适配,可以导入包下所有的类。
之所以要导入,是要提供一个管理名字空间的机制。所有类成员的名称都是彼此隔离的。

编写一个java源代码文件,此文件通常称为编译单元(有时也被称为转译单元)。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译器就不会接受。如果该编译单元之中还有额外的类的话,在包之外的世界是无法看见这些类的,它们不是public类,它们主要用来为主public类提供支持。

6.1.1代码组织
编译一个.java文件,在java文件中的每个类都会有一个输出文件,该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀名.class。编译少量.java文件,可能会得到大量的.class文件。
编译型语言:编译器产生一个中间文件(通常是一个obj文件),然后再与通过链接器(用以创建一个可执行文件)或类库产生器(librarian,用以创建一个类库)产生的其他同类文件捆绑在一起。
这不是java的工作方式,java可运行程序是一组可以打包并压缩为一个java文档文件(JAR,使用java的jar文档生成器)的.class文件。Java解释器负责这些文件的查找、装载和解释。
类库实际上市一组类文件,其中每个文件都有一个public类,以及任意数量的非public类。每个文件都有一个构件,如果希望这些构件(每一个都有它们自己的独立的.java和.class文件)从属于同一个群组,可以使用关键字package。Package语句必须是文件中除注释以外的第一句程序代码。
例如:package access;声明该编译单元是名为access的类库的一部分。
Java包的命名规则全部使用小写字母,包括中间的字也是如此。
Package和import关键字允许做的,是将单一的全局名字空间分割开,使得无论多少人使用internet以及java开始编写类,都不会出现名称冲突问题。

6.1.2 创建独一无二的包名
将特定包的所有.class文件都置于一个目录下,利用操作系统的层次化的文件结构来解决混乱问题一种方式,另一种方式是通过jar工具。
将所有的文件收入一个子目录还可以解决另外两个问题:创建独一无二的名称以及怎样查找有可能隐藏于目录结构中某处的类。这些任务是通过将.class文件所在的路径位置编码成package的名称来实现的。
把package名称分解为机器上的一个目录,当java程序运行并且需要加载.class文件的时候,就可以确定.class文件在目录上所处的位置。
Java解释器的运行过程:首先,找出环境变量CLASSPATH(可以通过操作系统来设置,有时也可通过安装程序-用来在机器上安装java或基于java的工具-来设置)。CLASSPATH包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称(.转换正斜杠还是反斜杠取决于操作系统)。得到的路径会与CLASSPATH中的各个不同的项相连接,解释器就在这些目录中查找所要创建的类名称相关的.class文件。(解释器还会去查找某些涉及java解释器所在位置的标准目录。)
CLASSPATHk可以包含多个可供选择的查询路径:
CLASSPATH=.;D\JAVA\LIB;C:\DOC\javaT
使用JAR文件时会有一点变化,必须在类路径中将JAR文件的实际名称写清楚,而不仅指明它所在位置的目录:
CLASSPATH=.;D\JAVA\LIB;C:\flavors\grape.jar

编译器碰到import语句,就开始在CLASSPATH所指定的目录中查找,让后从已编译的文件中找出名称相符者。

冲突:有时候import使用*适配时,可能引起冲突,两个不同的包下有相同名字的类。所以除非还要使用一个包中的其他东西,否则就没有必要使用*通配。

6.1.3 定制工具库
可以创建自己的工具库来减少或消除重复的程序代码。
创建了有用的新工具,都可以添加到自己的类库中,形成一个积累。

6.1.3 用import改变行为
Java没有C的条件编译功能,该功能可以不必更改任何程序代码,就能切换开关并产生不同的行为。Java去掉此功能的原因可能是因为C在绝大多数情况下是用此功能来解决跨平台问题的,即程序代码的不同部分是根据不同的平台来编译的。Java自身可以自动跨越不同的平台,这个功能对java而言没有必要。
条件编译的的用途:调试。调试功能在开发过程中是开启的,而在发布的产品中是禁用的。可以通过修改被导入的package的方法来实现这一目的,修改的方法是将程序中用到的代码从调试版改为发布版。这一技术可以适用于任何种类的条件代码。

6.1.5 对使用包的忠告
务必记住,无论何时创建包,都已经在给定包的名称的时候隐含地指定了目录结构。这个包必须位于其名称所指定的目录之中,而该目录必须是在以CLASSPATH开始的目录中可以查询到的。
编译过的代码通常放置在与源代码的不同目录中,但是必须保证JVN使用CLASSPATH可以找到该路径。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics