面向对象的三个基本概念(封装、继承、多态)

  封装(Encapsulation ) 是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误 用。理解封装性的一个方法就是把它想成一个黑匣子,它可 以阻止在外部定义的代码随意访问内部代码和数据。对黑匣子内代码和数据的访问通过一个适当定义的 接口严格控制。如果想与现实生活中的某个事物作对比,可考 虑汽车上的自动传送。自动传送中包含了有关引擎的数百比特的信息,例如你正在以什么样的加速度 前进,你行驶路面的坡度如何,以及目前的档位。作为用户,你 影响这个复杂封装的方法仅有一个:移动档位传动杆。例如,你不能通过使用拐弯信号或挡风玻璃 擦拭器影响传动。所以档位传动杆是把你和传动连接起来的惟一接 口。此外,传动对象内的任何操作都不会影响到外部对象,例如,档位传动装置不会打开车前 灯!因为自动传动被封装起来了,所以任何一家汽车制造商都可以选择 一种适合自己的方式来实现它。然而,从司机的观点来看,它们的用途都是一样的。与此相 同的观点能被用于编程。封装代码的好处是每个人都知道怎么访问它,但 却不必考虑它的内部实现细节,也不必害怕使用不当会带来负面影响。 

  Java封装的基本单元是类。尽管类将在以后章节详细介绍。现在仍有必要对它作一下简单的讨论。一个类(class)定义了将被一个对象集共享的结构和行为(数据和代码)。一个给定类的每个对象都包含这个类定义的行为和结构,好像它们是从同一个类的模子中铸造出来似的。因为这个原因,对象有时被看作是类的实例(instances of a class)。所以,类是一种逻辑结构,而对象是真正存在的物理实体。当创建一个类时,你要指定组成那个类的代码和数据。从总体上讲,这些元素都被称为该类的成员(members)。具体地说,类定义的数据称为成员变量(member variables)或实例变量(instance variables)。操作数据的代码称为成员方法(member methods )或简 称方法(methods )。如果你对C/C++熟悉,可以这样理解:Java程序员所称的方法,就是C/C++程序员所称的函数(function)。在完全用Java编写的程序中,方法定义如何使用成员变量。这意味着一个类的行为和接口是通过方法来定义的,类这些方法对它的实例数据进行操作。既然类的目的是封装复杂性,在类的内部就应该有隐藏实现复杂性机制。类中的每个方法或变量都可以被标记为私有(private )或公共(public )。 类 的公共接口代表类的外部用户需要知道或可以知道的每件事情;私有方法和数据仅能被一个类的成员代码所访问,其他任何不是类的成员的代码都不能访问私有 的 方法或变量。既然类的私有成员仅能被程序中的其他部分通过该类的公共方法访问,那么你就能保证不希望发生的事情就一定不会发生。当然,公共接口应该小 心仔 细设计,不要过多暴露类的内部内容。

  继承

  继承(Inheritance) 是 一个对象获得另一个对象的属性的过程。继承很重要,因为它支持了按层分类的概念。如前面提到的,大多数知识都可以按层级(即从上到下)分类管理。例 如, 尊贵的猎犬是狗类的一部分,狗又是哺乳动物类的一部分,哺乳动物类又是动物类的一部分。如果不使用层级的概念,我们就不得不分别定义每个动物的所有 属性。 使用了继承,一个对象就只需定义使它在所属类中独一无二的属性即可,因为它可以从它的父类那儿继承所有的通用属性。所以,可以这样说,正是继承机 制使一个 对象成为一个更具通用类的一个特定实例成为可能。下面让我们更具体地讨论这个过程。大多数人都认为世界是由对象组成的,而对象又是按动物、哺乳 动物和狗这 样的层级结构相互联系的。如果你想以一个抽象的方式描述动物,那么你可以通过大小、智力及骨胳系统的类型等属性进行描述。动物也具有确定的行 为,它们也需 要进食、呼吸,并且睡觉。这种对属性和行为的描述就是对动物类的定义。如果你想描述一个更具体的动物类,比如哺乳动物,它们会有更具体的属 性,比如牙齿类 型、乳腺类型等。我们说哺乳类动物是动物的子类(subclass),而动物是哺乳动物的超类(superclass)。由于哺乳动物类是需要更加精确定义的动物,所以它可以从动物类继承所有的属性。一个深度继承的子类继承了类层级(class hierarchy)中它的每个祖先的所有属性。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzffpd.html