《Java编程思想第六章访问权限控制》由会员分享,可在线阅读,更多相关《Java编程思想第六章访问权限控制(31页珍藏版)》请在金锄头文库上搜索。
1、第六章第六章 访问权限控制访问权限控制 包(包(包(包(PackagePackage) 成员的访问权限控制成员的访问权限控制成员的访问权限控制成员的访问权限控制 类的访问权限控制类的访问权限控制类的访问权限控制类的访问权限控制一、序言一、序言1 1、 为什么要使用访问权限控制?为什么要使用访问权限控制?为什么要使用访问权限控制?为什么要使用访问权限控制? 程序存在程序存在程序存在程序存在重构重构重构重构的可能和必要,但是类的的可能和必要,但是类的的可能和必要,但是类的的可能和必要,但是类的 消费者却希望你的代码保持不变消费者却希望你的代码保持不变消费者却希望你的代码保持不变消费者却希望你的代码
2、保持不变 利用利用利用利用封装封装封装封装和和和和访问权限控制访问权限控制访问权限控制访问权限控制来解决该矛盾,来解决该矛盾,来解决该矛盾,来解决该矛盾, 保证保证保证保证接口的声明接口的声明接口的声明接口的声明和和和和接口的功能接口的功能接口的功能接口的功能保持不变保持不变保持不变保持不变一、序言一、序言2 2、 访问权限的等级有:访问权限的等级有:访问权限的等级有:访问权限的等级有:publicpublic、 privateprivate、 protectedprotected和包访问权限和包访问权限和包访问权限和包访问权限 访问权限控制的第一基本原则访问权限控制的第一基本原则访问权限控制
3、的第一基本原则访问权限控制的第一基本原则: 尽可能尽可能尽可能尽可能 将一切数据和方法设为将一切数据和方法设为将一切数据和方法设为将一切数据和方法设为privateprivate, 而允许而允许而允许而允许 类的消费者访问和使用的方法设为类的消费者访问和使用的方法设为类的消费者访问和使用的方法设为类的消费者访问和使用的方法设为publicpublic二、包:库单元二、包:库单元1 1、 问题:在问题:在问题:在问题:在JavaJava环境中存在大量的类,环境中存在大量的类,环境中存在大量的类,环境中存在大量的类, 如何管理好这些类而避免冲突?如何管理好这些类而避免冲突?如何管理好这些类而避免冲
4、突?如何管理好这些类而避免冲突? 发生冲突的一个典例:发生冲突的一个典例:发生冲突的一个典例:发生冲突的一个典例: import net.mindview.simple.*import net.mindview.simple.*; / /自定义类库自定义类库自定义类库自定义类库 importimport java.util.* java.util.*;/ Java/ Java标准类库标准类库标准类库标准类库 假设:两个类库都有一个叫假设:两个类库都有一个叫假设:两个类库都有一个叫假设:两个类库都有一个叫VectorVector的类,的类,的类,的类, 那么下面的代码将导致冲突:那么下面的代码将
5、导致冲突:那么下面的代码将导致冲突:那么下面的代码将导致冲突: Vector v= new VectorVector v= new Vector();();();(); 因为编译器不知道到底应该调用哪个因为编译器不知道到底应该调用哪个因为编译器不知道到底应该调用哪个因为编译器不知道到底应该调用哪个VectorVector类类类类 仔细分析:其实在操作系统中也存在着同样问题仔细分析:其实在操作系统中也存在着同样问题仔细分析:其实在操作系统中也存在着同样问题仔细分析:其实在操作系统中也存在着同样问题 操作系统采用操作系统采用操作系统采用操作系统采用目录结构(文件夹)目录结构(文件夹)目录结构(文件
6、夹)目录结构(文件夹)来组织和管理来组织和管理来组织和管理来组织和管理 文件,各种文件被分门别类地存放在不同的目录文件,各种文件被分门别类地存放在不同的目录文件,各种文件被分门别类地存放在不同的目录文件,各种文件被分门别类地存放在不同的目录 类似的,类似的,类似的,类似的,JavaJava采用采用采用采用包(包(包(包(PackagePackage)来组织和管理来组织和管理来组织和管理来组织和管理类类类类 / / 从实验效果来看,从实验效果来看,从实验效果来看,从实验效果来看,包就是文件夹包就是文件夹包就是文件夹包就是文件夹 问题:以前的例子怎么没有包?(问题:以前的例子怎么没有包?(问题:以
7、前的例子怎么没有包?(问题:以前的例子怎么没有包?(默认包默认包默认包默认包)二、包:库单元二、包:库单元2 2、 代码组织代码组织代码组织代码组织 每个每个每个每个JavaJava文件都有一个文件都有一个文件都有一个文件都有一个publicpublic类(类(类(类(主类主类主类主类) 以及若干个非以及若干个非以及若干个非以及若干个非publicpublic类(类(类(类(辅助类辅助类辅助类辅助类) 当编译当编译当编译当编译JavaJava文件时,每个类都会有一个文件时,每个类都会有一个文件时,每个类都会有一个文件时,每个类都会有一个 输出文件(输出文件(输出文件(输出文件(.class.c
8、lass文件)文件)文件)文件)二、包:库单元二、包:库单元 类库(类库(类库(类库(Class LibraryClass Library) 由若干个由若干个由若干个由若干个JavaJava文件和更多的文件和更多的文件和更多的文件和更多的.class.class文件文件文件文件 组成组成组成组成 若我们希望这些文件同属于一个群组,若我们希望这些文件同属于一个群组,若我们希望这些文件同属于一个群组,若我们希望这些文件同属于一个群组, 就得使用包就得使用包就得使用包就得使用包二、包:库单元二、包:库单元 包(包(包(包(PackagePackage)的定义的定义的定义的定义 package pac
9、kage 包名;包名;包名;包名; 注意:包的定义必须是文件中除注释注意:包的定义必须是文件中除注释注意:包的定义必须是文件中除注释注意:包的定义必须是文件中除注释 以外的第一条语句以外的第一条语句以外的第一条语句以外的第一条语句二、包:库单元二、包:库单元 包中的类包中的类包中的类包中的类的使用方法的使用方法的使用方法的使用方法 要么使用全名要么使用全名要么使用全名要么使用全名 要么使用要么使用要么使用要么使用importimport关键字载入关键字载入关键字载入关键字载入二、包:库单元二、包:库单元3 3、 创建独一无二的包名创建独一无二的包名创建独一无二的包名创建独一无二的包名 包名由以
10、下两部分组成包名由以下两部分组成包名由以下两部分组成包名由以下两部分组成 类创建者的反顺序类创建者的反顺序类创建者的反顺序类创建者的反顺序internetinternet域名域名域名域名 包所在计算机的目录名称包所在计算机的目录名称包所在计算机的目录名称包所在计算机的目录名称 internetinternet域名是独一无二的,因此你的包名的域名是独一无二的,因此你的包名的域名是独一无二的,因此你的包名的域名是独一无二的,因此你的包名的 第一部分也应该是独一无二的第一部分也应该是独一无二的第一部分也应该是独一无二的第一部分也应该是独一无二的 典例:本文作者的域名为典例:本文作者的域名为典例:本文
11、作者的域名为典例:本文作者的域名为 反顺序以后变成:反顺序以后变成:反顺序以后变成:反顺序以后变成:net.mindviewnet.mindview 这是一劳永逸的解决方案这是一劳永逸的解决方案这是一劳永逸的解决方案这是一劳永逸的解决方案,否则如果缺少第一,否则如果缺少第一,否则如果缺少第一,否则如果缺少第一 部分,部分,部分,部分, 你在自己的计算机编写的你在自己的计算机编写的你在自己的计算机编写的你在自己的计算机编写的JavaJava程序没有程序没有程序没有程序没有 问题,但拿出去发布时就有可能冲突问题,但拿出去发布时就有可能冲突问题,但拿出去发布时就有可能冲突问题,但拿出去发布时就有可能
12、冲突二、包:库单元二、包:库单元 JavaJava编译器的运行过程编译器的运行过程编译器的运行过程编译器的运行过程 首先,找出环境变量首先,找出环境变量首先,找出环境变量首先,找出环境变量CLASSPATHCLASSPATH CLASSPATH CLASSPATH包含一个多个目录,用作包含一个多个目录,用作包含一个多个目录,用作包含一个多个目录,用作 查找查找查找查找.class.class文件的根目录文件的根目录文件的根目录文件的根目录 典型的典型的典型的典型的CLASSPATHCLASSPATH C:. C:.; C:Program FilesJavajdk1.6.0_10LIBC:Pro
13、gram FilesJavajdk1.6.0_10LIB; C:Program FilesJavajdk1.6.0_10DT.JARC:Program FilesJavajdk1.6.0_10DT.JAR; C:Program FilesJavajdk1.6.0_10TOOLS.JAR;C:Program FilesJavajdk1.6.0_10TOOLS.JAR;二、包:库单元二、包:库单元 其次,编译器利用其次,编译器利用其次,编译器利用其次,编译器利用CLASSPATHCLASSPATH根目录根目录根目录根目录 加上包名称产生一个加上包名称产生一个加上包名称产生一个加上包名称产生一个完整
14、路径名称完整路径名称完整路径名称完整路径名称 JavaJava的策略也很简单:将包名称的每个的策略也很简单:将包名称的每个的策略也很简单:将包名称的每个的策略也很简单:将包名称的每个 句点替换为反斜杠句点替换为反斜杠句点替换为反斜杠句点替换为反斜杠 典例:典例:典例:典例:foo.bar.bazfoo.bar.baz变换为变换为变换为变换为foobarbazfoobarbaz二、包:库单元二、包:库单元 此外,编译器还会去查找一些涉及此外,编译器还会去查找一些涉及此外,编译器还会去查找一些涉及此外,编译器还会去查找一些涉及JavaJava 编译器所在位置的标准目录编译器所在位置的标准目录编译器
15、所在位置的标准目录编译器所在位置的标准目录 比如:安装目录比如:安装目录比如:安装目录比如:安装目录binbin或安装目录或安装目录或安装目录或安装目录liblib 典例(典例(典例(典例(P112113P112113):):):): 文件文件文件文件1 1(Vector.javaVector.java文件):文件):文件):文件): package net.mindview.simplepackage net.mindview.simple; public class Vectorpublic class Vector Vector Vector()()()() /*.*/ /*.*/ 文件
16、文件文件文件2 2(List. javaList. java文件):文件):文件):文件): package net.mindview.simplepackage net.mindview.simple; public class Listpublic class List List List()()()() /*.*/ /*.*/ 注意:注意:注意:注意:VectorVector类和类和类和类和ListList类属于同一个包类属于同一个包类属于同一个包类属于同一个包 CLASSPAHTCLASSPAHT的配置为:的配置为:的配置为:的配置为: CLASSPATH=.CLASSPATH=.;D
17、:JAVALIBD:JAVALIB;C:DocJavaTC:DocJavaT 以此为例,仔细分析以此为例,仔细分析以此为例,仔细分析以此为例,仔细分析JavaJava编译器的是如何找到编译器的是如何找到编译器的是如何找到编译器的是如何找到 这两个文件的?这两个文件的?这两个文件的?这两个文件的? 这两个文件的位置:这两个文件的位置:这两个文件的位置:这两个文件的位置: C:DocJavaTnetmindviewsimpleC:DocJavaTnetmindviewsimple二、包:库单元二、包:库单元 特殊情况:使用特殊情况:使用特殊情况:使用特殊情况:使用JARJAR文件文件文件文件 必须
18、在类路径中将必须在类路径中将必须在类路径中将必须在类路径中将JARJAR文件的实际名称文件的实际名称文件的实际名称文件的实际名称 写清楚,而不仅仅是指明它所在的位置写清楚,而不仅仅是指明它所在的位置写清楚,而不仅仅是指明它所在的位置写清楚,而不仅仅是指明它所在的位置 典例(参见典例(参见典例(参见典例(参见P113P113)三、三、Java访问权限修饰词访问权限修饰词 JavaJava访问权限修饰词包含四种:访问权限修饰词包含四种:访问权限修饰词包含四种:访问权限修饰词包含四种: publicpublic、privateprivate、protectedprotected、缺省、缺省、缺省、缺
19、省 如果没有提供任何访问权限修饰词,如果没有提供任何访问权限修饰词,如果没有提供任何访问权限修饰词,如果没有提供任何访问权限修饰词, 则意味它是则意味它是则意味它是则意味它是包访问权限包访问权限包访问权限包访问权限三、三、Java访问权限修饰词访问权限修饰词1 1、 publicpublic:公共访问权限:公共访问权限:公共访问权限:公共访问权限 privateprivate:私有访问权限:私有访问权限:私有访问权限:私有访问权限 protectedprotected:保护访问权限:保护访问权限:保护访问权限:保护访问权限 前两者同前两者同前两者同前两者同C+ C+ 中的含义完全一致中的含义完
20、全一致中的含义完全一致中的含义完全一致 而而而而protectedprotected:= =子类子类子类子类+ +包访问权限包访问权限包访问权限包访问权限三、三、Java访问权限修饰词访问权限修饰词2 2、 缺省:包访问权限缺省:包访问权限缺省:包访问权限缺省:包访问权限 可以被处于同一个包中的所有类访问可以被处于同一个包中的所有类访问可以被处于同一个包中的所有类访问可以被处于同一个包中的所有类访问 由于同一包中的类在缺省情况下可以互相访问,由于同一包中的类在缺省情况下可以互相访问,由于同一包中的类在缺省情况下可以互相访问,由于同一包中的类在缺省情况下可以互相访问, 所以所以所以所以为了方便编
21、程和管理,通常把需要在一起为了方便编程和管理,通常把需要在一起为了方便编程和管理,通常把需要在一起为了方便编程和管理,通常把需要在一起 工作的类放在一个包里工作的类放在一个包里工作的类放在一个包里工作的类放在一个包里 访问权限控制的第二基本原则访问权限控制的第二基本原则访问权限控制的第二基本原则访问权限控制的第二基本原则:类消费者一般类消费者一般类消费者一般类消费者一般 不能享有包访问权限不能享有包访问权限不能享有包访问权限不能享有包访问权限 防止类的消费者访问并修改包中的类防止类的消费者访问并修改包中的类防止类的消费者访问并修改包中的类防止类的消费者访问并修改包中的类 根据两个基本原则,我们
22、可以得出以下结论:根据两个基本原则,我们可以得出以下结论:根据两个基本原则,我们可以得出以下结论:根据两个基本原则,我们可以得出以下结论: publicpublic:公共接口部分公共接口部分公共接口部分公共接口部分 类的消费者唯一能接触和使用的部分类的消费者唯一能接触和使用的部分类的消费者唯一能接触和使用的部分类的消费者唯一能接触和使用的部分 非非非非publicpublic:内部实现部分内部实现部分内部实现部分内部实现部分 封装和隐藏起来的具体实现细节封装和隐藏起来的具体实现细节封装和隐藏起来的具体实现细节封装和隐藏起来的具体实现细节 利用图形仔细分析这四个概念利用图形仔细分析这四个概念利用
23、图形仔细分析这四个概念利用图形仔细分析这四个概念三、三、Java访问权限修饰词访问权限修饰词3 3、 默认包(未命名包)默认包(未命名包)默认包(未命名包)默认包(未命名包) 在在在在JavaJava源代码文件中没有指明包名源代码文件中没有指明包名源代码文件中没有指明包名源代码文件中没有指明包名 从权限角度遵守上述规则从权限角度遵守上述规则从权限角度遵守上述规则从权限角度遵守上述规则 但但但但只能在当前目录下(缺省目录)只能在当前目录下(缺省目录)只能在当前目录下(缺省目录)只能在当前目录下(缺省目录)编译编译编译编译 和运行(因为它连名字都没有)和运行(因为它连名字都没有)和运行(因为它连名
24、字都没有)和运行(因为它连名字都没有)四、接口与实现四、接口与实现 JavaJava类的标准书写格式类的标准书写格式类的标准书写格式类的标准书写格式 publicpublic成员置于开头,后面跟成员置于开头,后面跟成员置于开头,后面跟成员置于开头,后面跟protectedprotected、 包访问权限和包访问权限和包访问权限和包访问权限和privateprivate成员成员成员成员五、类的访问权限五、类的访问权限 JavaJava类的访问权限有两种:类的访问权限有两种:类的访问权限有两种:类的访问权限有两种: publicpublic和包访问权限和包访问权限和包访问权限和包访问权限公共类(公共类(公共类(公共类(publicpublic)默认类默认类默认类默认类类成员访问类成员访问类成员访问类成员访问控制符控制符控制符控制符publicpublicprotectedprotected缺缺缺缺省省省省privateprivatepublicpublicprotectedprotected缺缺缺缺省省省省privateprivate可以访问类可以访问类可以访问类可以访问类成员的区域成员的区域成员的区域成员的区域A AB+CB+CB BD DB BB BB BD D习题习题 P113P113:习题:习题:习题:习题1 1 P120 P120:习题:习题:习题:习题5 5