为方便后面的讨论让我们先对这一领域的从业人员作一下分类从根本上说大致有两方面的人员涉足面向对象的编程类创建者(创建新数据类型的人)以及客户程序员(在自己的应用程序中采用现成数据类型的人)对客户程序员来讲最主要的目标就是收集一个充斥着各种类的编程工具箱以便快速开发符合自己要求的应用而对类创建者来说他们的目标则是从头构建一个类只向客户程序员开放有必要开放的东西(接口)其他所有细节都隐藏起来为什么要这样做?隐藏之后客户程序员就不能接触和改变那些细节所以原创者不用担心自己的作品会受到非法修改可确保它们不会对其他人造成影响 接口(Interface)规定了可对一个特定的对象发出哪些请求然而必须在某个地方存在着一些代码以便满足这些请求这些代码与那些隐藏起来的数据便叫作隐藏的实现站在程式化程序编写(Procedural Programming)的角度整个问题并不显得复杂一种类型含有与每种可能的请求关联起来的函数一旦向对象发出一个特定的请求就会调用那个函数我们通常将这个过程总结为向对象发送一条消息(提出一个请求)对象的职责就是决定如何对这条消息作出反应(执行相应的代码) 对于任何关系重要一点是让牵连到的所有成员都遵守相同的规则创建一个库时相当于同客户程序员建立了一种关系对方也是程序员但他们的目标是组合出一个特定的应用(程序)或者用您的库构建一个更大的库 若任何人都能使用一个类的所有成员那么客户程序员可对那个类做任何事情没有办法强制他们遵守任何约束即便非常不愿客户程序员直接操作类内包含的一些成员但倘若未进行访问控制就没有办法阻止这一情况的发生——所有东西都会暴露无遗 有两方面的原因促使我们控制对成员的访问第一个原因是防止程序员接触他们不该接触的东西——通常是内部数据类型的设计思想若只是为了解决特定的问题用户只需操作接口即可毋需明白这些信息我们向用户提供的实际是一种服务因为他们很容易就可看出哪些对自己非常重要以及哪些可忽略不计 进行访问控制的第二个原因是允许库设计人员修改内部结构不用担心它会对客户程序员造成什么影响例如我们最开始可能设计了一个形式简单的类以便简化开发以后又决定进行改写使其更快地运行若接口与实现方法早已隔离开并分别受到保护就可放心做到这一点只要求用户重新链接一下即可 Java采用三个显式(明确)关键字以及一个隐式(暗示)关键字来设置类边界publicprivateprotected以及暗示性的friendly若未明确指定其他关键字则默认为后者这些关键字的使用和含义都是相当直观的它们决定了谁能使用后续的定义内容public(公共)意味着后续的定义任何人均可使用而在另一方面private(私有)意味着除您自己类型的创建者以及那个类型的内部函数成员其他任何人都不能访问后续的定义信息private在您与客户程序员之间竖起了一堵墙若有人试图访问私有成员就会得到一个编译期错误friendly(友好的)涉及包装或封装(Package)的概念——即Java用来构建库的方法若某样东西是友好的意味着它只能在这个包装的范围内使用(所以这一访问级别有时也叫作包装访问)protected(受保护的)与private相似只是一个继承的类可访问受保护的成员但不能访问私有成员继承的问题不久就要谈到 |