Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » 科技英语  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Java Tuturial 翻译之对象
wolfigo





发贴: 2
于 2005-11-22 17:14 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
面向对象程序概念
2005-11-14
什么是对象?
对象是理解面向对象概念的关键。现在看看你的四周,你会看到很多现实世界对象的例子:狗、书桌、电视、自行车。
这些现实世界的对象都有以下两个特性:即状态和行为。举例来说,狗有状态(名字、颜色、血液、饥饿等)和行为(吠叫、取物、摇尾巴等);自行车也有状态(当前传送装置、脚踏板、两个轮子、齿轮集合等)和行为(刹车、加速、减速、更换齿轮等)。
程序上的对象将现实世界中的对象的状态和行为模型化了,用一到多个变量来保持它的状态,变量其实就是一个命好名的数据项;用方法来实现它的行为,方法其实就是一个与对象有关的函数(子程序)。
对象其实就是由很多变量和相关方法组成的集合
你需要使用程序上的对象来表示现实世界中的对象。你可能会把狗比作一个与动物相关的程序中的对象或者说会把自行车比作一个能够控制电子赛车程序中的对象,同样你可以用程序对象来表示一些抽象概念。举例来说,在GUI窗口系统中把用户点击鼠标键或按下键盘上的某一个键时触发的动作称之为一个事件。如下图是程序对象的图形化表示:

1.1 concepts-object

对于程序对象所知道的(状态)和所能做的(行为)的任何东西都用它内部的变量和方法来表示,比如对自行车建模的对象应该能指明自行车当前的状态信息:速度为18mph,蹬脚踏板的速度为90rpm,当前的齿轮点为第五个。在形式上这些变量被认为是实例变量,因为它们包含一个指定自行车对象的状态,并且在面向对象技术中,一个特定的对象被叫作是一个实例。如下图是自行车的建模对象:

1.2 concepts-bicycleObject

除了它的变量以外,这个自行车对象也会有刹车、改变蹬脚踏板的速度以及更换齿轮的方法(这车并没有提供改变车速的方法,因为这取决于骑车人的蹬脚踏板的速度以及内置齿轮的边际效果)。在形式上这些方法被称之为实例方法,因为它们观察和改变某一个特定自行车对象的状态。
上面的对象图显示出自行车的变量构成了对象的核心部分,四周的方法向程序中的其它对象隐藏了它的核心部分。用方法来包装变量的保护机制称之为封装。概念上的对象图,一个由方法保护层之下包装的核心变量的对象,实质是对象的理想化表现,也是面向对象系统设计者一直努力要达到的目标。但是,实际情况并不是这样的,通常由于实际操作的原因,可能会希望暴露对象的某些变量或者隐藏它的一些方法。在Java编程语言中,对象会为它的变量和方法标识四种访问限制中的一种,这种限制决定了其它对象或类能够访问的它的变量和方法。详情请见《控制对类成员的访问》。
把相关的变量和方法封装到同一完整的软件包中是很简单的,仍然还是要提供能让广大软件开发者受益的两点好处:
l  模块化:对象的源代码是可写,可维护的,并独立于其它对象的源代码之外。同时,对象要在系统之间容易传递,比如你可以把你的自行车给其它人使用,它仍然可以正常使用。
l  信息隐藏:对象其实就是一个能让其它对象与它交流的公有接口。对象可以在任意时候修改自己的私有变量和方法,而依赖于它的其它对象不会因此受到影响。你不需要知道在你自行车上的齿轮装置的原理而正常使用它。
什么是消息?
  一般说来单独的对象是没有任何作用的。相反,对象通常是作为一个包含很多对象的大系统或应用程序的某个组件出现的。程序员通过与其它对象的交互,来实现更高层次的功能和更复杂的行为。放在车库里的自行车仅仅是一堆金属和橡胶的混合物而己,对它自己而言,它不能进行任何行动。只有当你和它的脚踏板发生交互时,自行车才会发挥它自己的功用。
  程序中的对象通过发送消息来与其它对象发生交互关系。当对象A想要对象B执行它的一个方法时,对象A会向对象B发送一条消息,如下图所示:

1.3 concepts-message
  
  有时候,接受消息的对象需要知道更多的信息以至于更精确地完成所需要的操作;举例来说,当你想更换自行车上的齿轮,你得指明要换哪个齿轮。随消息被传递的信息被称之为参数。
  下图显示了消息相关的三部分:
l  消息要到达的对象
l  要执行的方法名
l  方法所需要的所有参数

1.4 concepts-bicycleMessage

这三个组件为接受对象去执行期待的方法提供了足够的信息,不再需要其它的信息或上下文信息了。
消息传递提供了以下两点好处:
l  对象的行为是通过它的方法来体现的,所以消息传递支持对象间所有可能的交互。
l  对象不需要在同一程序下,甚至于不需要在同一台机器上彼此来回传递和接收信息。
什么是类?
  在现实世界中,你经常会看到很多同一种类的物体。比如你的自行车只是世界上很多自行车中的一辆而己。在面向对象技术中,我们可以说你的自行车是自行车类对象的一个实例。自行车有一些共同的状态(当前齿轮、当前脚踏板、两个轮子)和行为(更换齿轮,刹车),但是,每辆自行车的状态都是独立的,是不同于其它自行车的。
  当生产自行车时,制造商利用它可以共享的特性,用相同的设计图制造很多的自行车。要是对于每辆自行车都采用一套新的设计图来做的话,效率会很低下的。
  在面向对象程序中,让很多同类对象共享彼此的特性,如矩形、员工记录、视频剪辑等,是可以实现的。类似于自行车制造商,你也可以利用同类对象具有相似的行为,为这些对象创建一个新的设计图。为对象创建的软件设计图就称之为类。
类就是为同一种类的所有对象所定义的共同属性和方法的设计图。
一个类通常可表示成下图所示的样子:

1.5 concepts-class

自行车例子类为每个自行车对象都声明了包含当前齿轮、当前脚踏板等必要的实例变量。这个类同样也声明和提供了如下图所示的允许骑车人更换齿轮、刹车和改变蹬脚踏板的速度的实例方法的实现。

1.6 concepts-bicycleClass

在你创建自行车类之后,你可以从这个类中创建很多自行车对象。当你创建类的实例时,系统会为你的对象及所有的实例变量分配足够的内存。每个实例都会得到在类中所定义好的所有实例变量的一份拷贝(如下图所示)。

1.7 concepts-2BicycleObjects

除了这些实例变量以外,类还可以定义类变量。一个类变量包含了所有类实例的共享信息。比如假定所有自行车上都有相同数量的齿轮,在这个例子中,用实例变量来保存齿轮的数量信息是低效的;每个实例都会有这个变量的一份拷贝,但对于每个实例来说,值都是一样的。在这种情况下,你就需要定义一个类变量来保存齿轮的数量,所有的实例都会共享这个类变量。如果一个实例修改了这个变量的值,那么同时也修改了这个类的所有其它实例的这个变量的值。类也可以声明类方法,你可以从类中直接调用这个类方法,否则的话,你必须用一个实例对象来调用它的实例方法。


 1.8 concepts-yourBike

《理解实例和类成员》这部分详细讨论了实例变量和实例方法,以及类变量和类方法。
对象提供了模块化和信息隐藏的好处,类提供了复用的好处。自行车制造商多次使用相同的设计图来制造很多的自行车。程序员也多次使用相同的类及代码来创建很多的对象。
你可能会注意到类与对象的描述看起来是那么的相似。确实是这样的,类与对象的不同通常都是造成某些混淆的根源。在现实世界中,类不像对象所描述的那样:自行车的设计图并不是一辆自行车。但是,要想在程序中区分类与对象是有一定难度的,这主要是因为程序对象仅仅是现实世界对象的电子模型或抽象概念。然而也是因为对象有时也被用来指代类与实例。
综上所述,类并没有被隐藏,因为它代表对象的设计图而不是对象本身。通过比较,我们知道对象是隐藏的,说明对象是存在的并且你可以使用它。
什么是继承?
  一般来说,对象是以类的方式定义的,你可以通过了解类来了解它的对象。即便你不知道penney-farthing是什么,但如果我告诉你它是一辆自行车,你马上就会知道它有两个轮子、车把、脚踏板。
  面向对象系统进一步扩展了这个概念,即类可以以其它类的方式来定义。比如山地车、单车、脚踏车等都是自行车的一种。在面向对象技术中,把山地车、单车、脚踏车都称之为自行车的子类。简单地说,自行车是山地车、单车、脚踏车的父类。下图显示出这种关系:

1.9 concepts-bikeHierarchy

  每个子类都继承父类的状态(变量声明),山地车、单车、脚踏车共享一些状态:脚踏板、速度等。同时,每个子类还继承父类的方法,山地车、单车、脚踏车共享一些行为:刹车、加速等。
  但是,子类并不受限于父类所提供的状态和行为,它可以增加一些父类所没有的状态和行为。如脚踏车有两个座位及车把;一些山地车有额外的链档,可以保持低速档比率。
  子类同样可以覆盖继承的方法并为这些方法提供特定的实现。比如你有一辆拥有额外链档的山地车,你可以覆盖更换齿轮档的方法来使得骑车人能转换到低速档上。
  你也可以不必受限于一层继承。继承树及类的继承层次,都可以达到期望的深度。方法与变量也会随着继承层次而往下传递。一般说来,类的继承层次越深入,它的行为就越具体。
  类的继承层次会影响类是什么,不会影响它的实现。比如我们实现一个三轮车类,把它作为自行车类的子类可能会很方便,毕竟它们都有当前速度和脚踏板。但是因为三轮车并不是自行车,把这两个类绑在一起是不明智的。它会使用户糊涂,使得三轮车类具有它不需要的方法,使得更新或加强这个三轮车类变得很困难。
  Object类位于类层次结构的顶点,并且每个类都直接或间接是它的后代。Object类的变量会保持对任何对象的引用,比如类实例或数组。Object类会提供让所有运行在Java虚拟机上的对象所共享的行为方法,如所有类都继承Object类的返回当前对象的字符串表示的toString()方法。《管理继承》部分详细说明了Object类的用法。
  继承提供以下好处:
l  子类根据父类所提供的公共基本元素来形成自己特定的行为。通过对继承的使用,程序员可多次复用父类的代码。
l  程序员能实现被称之为抽象类的父类的所有公共方法。抽象类定义并提供了主要的行为方法,但大多数类是未定义,未实现的。其它程序员具体实现特定的子类。
什么是接口?
  一般来说接口就是不相关的实体间用来互相访问的设备或系统。根据这个定义,远程控制就是你和电视之间的接口,英语是两人交流的接口,并且遵守军队中的行为守则也是不同级别人之间的接口。
  在Java编程语言中,接口只是一个类型,就像类也是一个类型一样。跟类一样,接口也可以定义方法。与类不同的是,接口不用实现这些方法;相反,类必须实现它所实现的接口中所定义的所有方法。类可以实现很多个接口。
  自行车类与它的类继承层次结构按照它们的方式定义了它们能做的和不能做的事情。但是,自行车是用其它方式来与这个世界交互的。比如在商店中的自行车可以用一个存货程序来管理。这个程序并不关心它所管理的东西到底是什么,只要每项物品提供一定的信息,如价钱和编号等。它制定了一个通信协议,而不是强制不相关的物品之间发生关联。这套协议是通过接口中所定义的一系列方法来进行的。这个存货接口只是定义,而不实现,诸如设置或得到确切价格,分配编号等操作的方法。
  为了能让这个存货程序很好地工作,自行车类必须通过实现这个接口来接受这个协议。当类实现接口时,类必须接受实现这个接口中所定义的所有方法。因此,自行车类需要提供设置或得到确切价格,分配编号等操作的方法的具体实现。
  你需要使用接口来定义在类继承层次中的类实现该接口时所遵守的行为规范。接口有如下好处:
l  捕获不相关类之间的相似性,而不是强制它们之间产生关系。
l  声明一个或多个类需要实现的方法。
l  显示对象编程的接口而不是显示相关类的信息。
l  模仿多重继承这个一些面向对象语言支持的特性,允许类可以有一个或多个父类。




话题树型展开
人气 标题 作者 字数 发贴时间
13183 Java Tuturial 翻译之对象 wolfigo 4955 2005-11-22 17:14
10570 Re:Java Tuturial 翻译之对象 ranchgirl 148 2005-11-23 00:01
10736 Re:Java Tuturial 翻译之对象 wolfigo 98 2005-12-01 12:10
12180 Re:Java Tuturial 翻译之对象 ranchgirl 339 2005-12-01 14:04

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923