2012-05-02
149-158/913
Java编程思想第四版——第十九天
6.2 java访问权限修饰词
public、protected和private这几个java访问权限修饰词在使用时,是置于类中每个成员的定义之前的——无论它是一个域还是一个方法。每个访问权限修饰词仅控制它所修饰的特定定义的访问权。
如果不提供任何访问权限修饰词,则意味着它是“包访问权限”。因此,无论如何,所有事物都具有某种形式的访问控制权限。
6.2.1 包访问权限
一个编译单元(即一个文件),只能隶属于一个包,所以经由包访问权限,处于同一个编译单元中的所有类彼此之间都是自动可访问的。
取得对某成员的访问权的唯一途径是:
1. 使该成员成为public。无论是谁,无论在哪里,都可以访问该成员。
2. 通过不加访问权限修饰词并将其他类放置于同一个包内的方式给成员赋予包访问权。于是包内的其他类也就可以访问该成员了。
3. 继承而来的类既可以访问public成员也可访问protected成员(但不能访问private成员)。只有两个类都处于同一个包内时,它才可以访问包访问权限的成员。
4. 提供访问器(accessor)和变异器(mutator)方法(也称作get/set方法),以读取和改变数值。对OOP而言,这是最优雅的方式,而且这也是JavaBeans的基本原理。
6.2.2 public:接口访问权限
使用public,就意味着public之后紧跟着的成员声明自己对每个人都是可用的,尤其是使用类库的客户程序员更是如此。
不要错误的认为java总是将当前目录视作是查找行为的起点之一,如果CLASSPATH缺少一个“.”作为路径之一的话,java就不会查找当前目录了。
默认包:
为了使文件可以被编译,在CLASSPATH之中一定要有“.”。
Java将同处于相同的目录并且没有给自己设定任何包名称的文件自动看作是隶属于该目录的默认包之中,并为该目录中所有其他的文件都提供了包访问权限。
6.2.3 private:你无法访问
关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
多线程环境下,private的使用很重要。
Private可以用到的地方:想控制如何创建对象,并阻止别人直接访问某个特定的构造器(或全部构造器),把类的构造器声明成private的,让后用一个方法来获得该对象。
默认构造器是唯一定义的构造器,并且是private的,那么它将阻碍对此类的继承。
6.2.4 protected:继承访问权限
关键字protected处理的是继承的概念,通过继承可以利用一个现有类——我们将其称为基类,然后将新成员添加到该现有类中而不必碰该现有类。还可以改变类的现有成员的行为。为了从现有类中继承,需要声明新类extends(扩展)了一个现有类。
例如:class Foo extends Bar
类定义中的其他部分看起来都是一样的。
protected也提供包访问权限。
6.3 接口和实现
访问权限的控制常被称为是具体实现的隐藏。
把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
出于两个很重要的原因,访问权限控制将权限的边界划在了数据类型的内部。第一个原因是要设定客户端程序员可以使用和不可以使用的界限。可以在结构中建立自己的内部机制,而不必担心客户端程序员会偶然地将内部机制当作是他们可以使用的接口的一部分。
这个原因直接引出了第二个原因,即将接口和具体实现进行分离。如果结构是用于一组程序之中,而客户端程序员除了可以向接口发送信息之外什么也不可以做的话,那么就可以随意更改所有不是public的东西(例如有包访问权限、protected和private的成员),而不会破坏客户端代码。
类浏览器可以将接口展现给某个类的使用者。
6.4 类的访问权限
在java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的。
可以控制是否能创建一个该类的对象。
为了控制某个类的访问权限,修饰词必须出现于关键字class之前。
访问public类:
public class Widget{
通过下面的声明访问:
import access.Widget;
或import access.*;
有一些额外的限制:
1. 每个编译单元(文件)都只能有一个public类。这表示,每个编译单元都有单一的公共接口,用public类来表现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出出错信息。
2. Public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。
3. 编译单元内完全不带public类也是可能的,这种情况下,可以随意对文件命名。
创建一个包访问权限的类时,仍旧是在将该类的域声明为private时才有意义——应尽可能地总是将域指定为私有的,但是通常来说,将与类(包访问权限)相同的访问权限赋予方法也是很合理的。
类既不可以是private的(这样会使得除该类外,其他任何类都不可以访问它),也不可以是protected的(一个内部类可以是private或是protected的,这是一个特例)。对于类的访问权限,仅有两个选择:包访问权限或public。如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象,有一个例外,在该类的static成员内部可以创建。
方法中void意思是不返回任何东西。也可以返回一个对象引用。
Singleton(单例):
class Singleton{
private Singleton(){
}
private static Singleton s = new Singleton();
public static Singleton getSingleton(){
return s;
}
}
始终只能创建它的一个对象,类的对象是作为一个private static成员而创建的,有且仅有一个,除非是通过getSingleton()方法,否则是无法访问到它的。
如果没能为类访问权限指定一个访问修饰符,就会默认得到包访问权限。这就意味着该类的对象可以由包内任何其他类来创建,但在包外则是不行的。(相同目录下的所有不具有明确package声明的文件,都被视作是该目录下默认包的一部分。)如果该类的某个static成员是public的话,客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象。
6.5 总结
无论是在什么样的关系之中,设立一些为各成员所遵守的界限始终是很重要的。
本章讨论了类是如何被构建成类库的:首先,介绍了一组类是如何被打包到一个类库中的;其次,类是如何控制对其成员的访问的。
C语言仅有单一的“名字空间”,代码多了就可能发生名称冲突,引发额外的管理开销。对于java,关键字package、包的命名模式和关键字import,可以使名称进行完全的控制,因此名称冲突的问题是很容易避免的。
控制对成员的访问权限有两个原因。第一是为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作是必要的,但是它并不属于客户端程序员所需接口的一部分。第二个原因,很重要的原因,是为了让类库设计者可以更改的内部工作方式,而不必担心这样会对客户端程序员产生重大的影响。
注意,访问权限控制专注于类库创建者和该类库的外部使用者之间的关系,这种关系也是一种通信方式。然而,在许多情况下事情并非如此。例如,自己编写了所有的代码,或者在一个组员聚集一起的项目组中工作,所有的东西都放在同一个包中。这些情况是另外一种不同的通信方式,因此严格的遵循访问权限规则并不一定是最佳选择,默认(包)访问权限也许更可行。
下一章复用类。
149-158/913
Java编程思想第四版——第十九天
6.2 java访问权限修饰词
public、protected和private这几个java访问权限修饰词在使用时,是置于类中每个成员的定义之前的——无论它是一个域还是一个方法。每个访问权限修饰词仅控制它所修饰的特定定义的访问权。
如果不提供任何访问权限修饰词,则意味着它是“包访问权限”。因此,无论如何,所有事物都具有某种形式的访问控制权限。
6.2.1 包访问权限
一个编译单元(即一个文件),只能隶属于一个包,所以经由包访问权限,处于同一个编译单元中的所有类彼此之间都是自动可访问的。
取得对某成员的访问权的唯一途径是:
1. 使该成员成为public。无论是谁,无论在哪里,都可以访问该成员。
2. 通过不加访问权限修饰词并将其他类放置于同一个包内的方式给成员赋予包访问权。于是包内的其他类也就可以访问该成员了。
3. 继承而来的类既可以访问public成员也可访问protected成员(但不能访问private成员)。只有两个类都处于同一个包内时,它才可以访问包访问权限的成员。
4. 提供访问器(accessor)和变异器(mutator)方法(也称作get/set方法),以读取和改变数值。对OOP而言,这是最优雅的方式,而且这也是JavaBeans的基本原理。
6.2.2 public:接口访问权限
使用public,就意味着public之后紧跟着的成员声明自己对每个人都是可用的,尤其是使用类库的客户程序员更是如此。
不要错误的认为java总是将当前目录视作是查找行为的起点之一,如果CLASSPATH缺少一个“.”作为路径之一的话,java就不会查找当前目录了。
默认包:
为了使文件可以被编译,在CLASSPATH之中一定要有“.”。
Java将同处于相同的目录并且没有给自己设定任何包名称的文件自动看作是隶属于该目录的默认包之中,并为该目录中所有其他的文件都提供了包访问权限。
6.2.3 private:你无法访问
关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
多线程环境下,private的使用很重要。
Private可以用到的地方:想控制如何创建对象,并阻止别人直接访问某个特定的构造器(或全部构造器),把类的构造器声明成private的,让后用一个方法来获得该对象。
默认构造器是唯一定义的构造器,并且是private的,那么它将阻碍对此类的继承。
6.2.4 protected:继承访问权限
关键字protected处理的是继承的概念,通过继承可以利用一个现有类——我们将其称为基类,然后将新成员添加到该现有类中而不必碰该现有类。还可以改变类的现有成员的行为。为了从现有类中继承,需要声明新类extends(扩展)了一个现有类。
例如:class Foo extends Bar
类定义中的其他部分看起来都是一样的。
protected也提供包访问权限。
6.3 接口和实现
访问权限的控制常被称为是具体实现的隐藏。
把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。其结果是一个同时带有特征和行为的数据类型。
出于两个很重要的原因,访问权限控制将权限的边界划在了数据类型的内部。第一个原因是要设定客户端程序员可以使用和不可以使用的界限。可以在结构中建立自己的内部机制,而不必担心客户端程序员会偶然地将内部机制当作是他们可以使用的接口的一部分。
这个原因直接引出了第二个原因,即将接口和具体实现进行分离。如果结构是用于一组程序之中,而客户端程序员除了可以向接口发送信息之外什么也不可以做的话,那么就可以随意更改所有不是public的东西(例如有包访问权限、protected和private的成员),而不会破坏客户端代码。
类浏览器可以将接口展现给某个类的使用者。
6.4 类的访问权限
在java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的。
可以控制是否能创建一个该类的对象。
为了控制某个类的访问权限,修饰词必须出现于关键字class之前。
访问public类:
public class Widget{
通过下面的声明访问:
import access.Widget;
或import access.*;
有一些额外的限制:
1. 每个编译单元(文件)都只能有一个public类。这表示,每个编译单元都有单一的公共接口,用public类来表现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出出错信息。
2. Public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。
3. 编译单元内完全不带public类也是可能的,这种情况下,可以随意对文件命名。
创建一个包访问权限的类时,仍旧是在将该类的域声明为private时才有意义——应尽可能地总是将域指定为私有的,但是通常来说,将与类(包访问权限)相同的访问权限赋予方法也是很合理的。
类既不可以是private的(这样会使得除该类外,其他任何类都不可以访问它),也不可以是protected的(一个内部类可以是private或是protected的,这是一个特例)。对于类的访问权限,仅有两个选择:包访问权限或public。如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象,有一个例外,在该类的static成员内部可以创建。
方法中void意思是不返回任何东西。也可以返回一个对象引用。
Singleton(单例):
class Singleton{
private Singleton(){
}
private static Singleton s = new Singleton();
public static Singleton getSingleton(){
return s;
}
}
始终只能创建它的一个对象,类的对象是作为一个private static成员而创建的,有且仅有一个,除非是通过getSingleton()方法,否则是无法访问到它的。
如果没能为类访问权限指定一个访问修饰符,就会默认得到包访问权限。这就意味着该类的对象可以由包内任何其他类来创建,但在包外则是不行的。(相同目录下的所有不具有明确package声明的文件,都被视作是该目录下默认包的一部分。)如果该类的某个static成员是public的话,客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象。
6.5 总结
无论是在什么样的关系之中,设立一些为各成员所遵守的界限始终是很重要的。
本章讨论了类是如何被构建成类库的:首先,介绍了一组类是如何被打包到一个类库中的;其次,类是如何控制对其成员的访问的。
C语言仅有单一的“名字空间”,代码多了就可能发生名称冲突,引发额外的管理开销。对于java,关键字package、包的命名模式和关键字import,可以使名称进行完全的控制,因此名称冲突的问题是很容易避免的。
控制对成员的访问权限有两个原因。第一是为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作是必要的,但是它并不属于客户端程序员所需接口的一部分。第二个原因,很重要的原因,是为了让类库设计者可以更改的内部工作方式,而不必担心这样会对客户端程序员产生重大的影响。
注意,访问权限控制专注于类库创建者和该类库的外部使用者之间的关系,这种关系也是一种通信方式。然而,在许多情况下事情并非如此。例如,自己编写了所有的代码,或者在一个组员聚集一起的项目组中工作,所有的东西都放在同一个包中。这些情况是另外一种不同的通信方式,因此严格的遵循访问权限规则并不一定是最佳选择,默认(包)访问权限也许更可行。
下一章复用类。
发表评论
-
Java编程思想第四版——第二十一天
2012-05-04 12:56 5772012-05-04 163-170/913 Java编 ... -
Java编程思想第四版——第二十天
2012-05-03 13:45 7022012-05-03 158-163/913 Java编程思 ... -
Java编程思想第四版——第十八天
2012-04-27 13:12 10022012-04-27 142-149/913 Java编 ... -
Java编程思想第四版——第十七天
2012-04-25 11:18 7422012-04-25 138-142/913 Java编程思 ... -
Java编程思想第四版——第十六天
2012-04-24 13:50 7502012-04-24 131-138/913 Java编 ... -
Java编程思想第四版——第十五天
2012-04-23 17:14 7542012-04-23 121-131/913 Java编程思 ... -
Java编程思想第四版——第十四天
2012-04-19 11:28 6252012-04-19 118-121/913 Java编程思 ... -
Java编程思想第四版——第十三天
2012-04-18 12:08 6652012-04-18 108-118/913 Java编 ... -
Java编程思想第四版——第十二天
2012-04-09 10:58 7342012-04-09 102-108/913 Java编 ... -
Java编程思想第四版——第十一天
2012-04-05 12:21 8192012-04-05 Java编程思想第四版——第十一天 ... -
Java编程思想第四版——第十天
2012-03-31 12:03 5582012-03-31 97-102/913 Java编程思想 ... -
Java编程思想第四版——第九天
2012-03-30 14:59 6512012-03-30 80-97/913 Java编程思想第 ... -
Java编程思想第四版——第八天
2012-03-29 12:09 4822012-03-29 76-80/913 3.6 自动递增和 ... -
Java编程思想第四版——第七天
2012-03-28 12:24 6562012-03-28 70-76/913 昨天找 ... -
Java编程思想第四版——第六天
2012-03-27 13:02 5272012-03-27 66-70/913 最近两 ... -
Java编程思想第四版——第五天
2012-03-23 15:09 9422012-03-23 60-66/913 2.5 方法、参数 ... -
Java编程思想第四版——第四天
2012-03-22 12:41 5882012-03-22 54-60/913 第二章 ... -
Java编程思想第四版——第三天
2012-03-21 12:40 5682012-03-21 47-54/913 1.12 并 ... -
Java编程思想第四版——第二天
2012-03-20 13:54 728今天本来以为进度可以 ... -
Java编程思想第四版——第一天
2012-03-19 15:57 784Java已经丢手一年了 ...
相关推荐
- **第四章:树** —— 深入讨论了树的各种类型(如二叉树、平衡树等)及其操作,如遍历、插入和删除。 - **第五章:散列** —— 介绍了散列表的工作原理、散列函数的设计以及处理冲突的方法。 - **第六章:优先队列...
提高部分从第十一章至第十六章,重点关注Java语言在实际编程中的高级应用,旨在帮助读者掌握更复杂的编程技巧,以便进行大型Java应用程序的开发。这部分包括: 1. **对象容器类**:第十一章讲解了如何使用Java提供...
2. **加权图**:第十四章重点讨论了加权图的特性以及基于加权图的最短路径算法,如迪杰斯特拉算法、弗洛伊德算法等。 #### 六、综合运用 1. **何时使用何种数据结构**:最后一部分总结了在不同情况下选择合适的...
根据提供的文件信息,我们可以归纳出该书《数据结构与算法分析_java语言描述》的主要知识点及其相关内容。本书由Mark Allen Weiss撰写,是计算机科学领域内学习数据结构与算法的经典教材之一。接下来,我们将按照各...
阅读本书唯一的前提条件,是具备对Java编程或类似面向对象语言(比如说C#)的基本理解,不需要拥有为移动设备开发软件的经验。实际上,如果你确实有这方面的经验,反倒应该忘记它们。Android是如此与众不同,因此...
5.8 版本 6:第四次优化:缓存(Caching) 5.9 从故事中学到的 第6章 集成测试框架:脆弱之美 6.1. 三个类搞定一个验收测试框架 6.2. 框架设计的挑战 6.3. 开放式框架 6.4. 一个HTML解析器可以简单到什么程度? 6.5. ...
第四章 数 据 类 型 .28 4.1 值 类 型 .28 4.2 引 用 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 ...
**第十天:创建视图和索引** - **使用视图**:介绍了视图的概念及其用途。 - **列的重命名**:教授了如何更改视图中列的名称。 - **SQL对视图的处理过程**:解释了SQL引擎如何处理包含视图的查询请求。 以上内容...
##### 第十三章:事件和索引指示器 - **13.1 事件** 介绍如何定义和使用事件,以及如何订阅和取消订阅事件。 - **13.2 索引指示器** 讨论了如何使用索引来访问数组或集合中的元素。 - **13.3 小结** 事件和...
- C#结合了C++的强大功能和Java的简洁性,旨在提供一个更安全、更易于使用的编程环境。 - 在.NET框架中,C#是首选的开发语言之一,它支持跨平台应用开发,并且具有丰富的类库支持。 - **1.3 C#语言的特点** - ...
#### 十九、函数的变长参数【对比java的变长参数】 - **变长参数**:讨论函数如何接受数量不确定的参数。 - **Java对比**:与Java中的变长参数机制进行比较。 #### 二十、函数的递归【C语言实现斐波那契数列】 - ...
- 面向对象的编程思想是C#设计的基础,掌握面向对象的基本概念和技术对于编写高质量的C#程序至关重要。 ##### 第十章:类 - **10.1 类的声明** - 类是对象的模板,包含数据成员和成员方法。 - **10.2 类的成员**...
- 概述了面向对象编程的基本思想及其分析设计过程。 ##### 第十章:类 - **10.1 类的声明** - 类是一组具有相同属性和行为的对象的集合。 - 类声明定义了类的名称、成员变量和方法等。 - **10.2 类的成员** - ...