《Java 7程序设计入门经典》一1.5 面向对象编程的关键特性

1.5 面向对象编程的关键特性

Java的核心在于面向对象编程(Object-Oriented Programming,OOP)。面向对象的方法学是Java不可或缺的一部分。所有的Java程序或多或少都是面向对象的。因为面向对象对Java如此重要,甚至在写一个简单的Java程序前了解面向对象的基本原则都是有用的。
面向对象是解决编程工作的一个强有力的方法。自从计算机发明以来,编程方法学有着很大的变化,这些变化主要是为了适应不断增长的编程复杂度。例如,在计算机刚发明时,编程是通过计算机的前面板(front panel)以二进制机器指令的方式输入的。由于程序只有几百个指令,这种方法还可行。随着程序长度的增加,汇编语言应运而生。程序员可以使用机器指令的符号表示,来处理更大的、更复杂的程序。第一种广泛流行的语言是FORTRAN。经过这是非常引人注目的一步,但是大型的FORTRAN程序还是相当难以理解。
20世纪90年代,结构化编程诞生了。这是C和Pascal推崇的方法。结构化语言的使用使得编写适当复杂的程序变得相当容易。结构化语言的特点有:独立的子例程、局部变量、丰富的控制结构、不依赖于GOTO语句。尽管结构化语言是一个强有力的工具,它们也会遇到瓶颈。
不妨这么考虑:在编程发展的各个关键节点,技术和工具的发明使得程序员能够处理更大的复杂度。在语言演进的道路上,新的方法都攫取前人的最好元素,并再向前改良。在面向对象编程发明之前,许多项目都几乎接近(甚至已经)崩溃。面向对象的方法能够帮助程序员克服这些障碍。
面向对象编程汲取了结构化编程中最优秀的思想,将其与一些新的概念结合。这产生了一种组织程序的不同方法。一般认为,程序可以用以下两种方法中的一种进行组织:围绕代码(即发生的动作)进行组织,或围绕数据(即受影响的内容)进行组织。若只用结构化编程技术,程序一般围绕代码组织。这种方法可以认为是“代码操作数据”的思想。
面向对象编程使用另一种方法。它围绕数据进行组织,它的关键原则是:数据控制代码的访问权限。在面向对象语言中,可以定义数据和运行操作数据的子例程。于是,数据类型精确定义了什么类型的操作可以应用于这个数据。
为了支持面向对象编程的原则,所有面向对象的语言(包括Java)有三种特性:封装、多态和继承。让我们对此逐一考查。

1.5.1 封装

封装(encapsulation)是一种编程技术,它将代码与其操作的数据绑定起来,使它们在有外界的干扰和误用的情况下保持安全。在面向对象语言中,代码和数据可以以一种自包含的黑盒(black box)的方式绑定。在这个黑盒内,有所有必需的数据和代码。当代码和数据以这种方式联系起来时,对象就诞生了。换句话说,对象是支持封装的设备。
在对象内部,对对象而言,代码、数据或两者都有可能是私有的(private)或公有的(public)。只有对象其他部分才能解和访问私有代码和数据。也就是说,对象外部存在的程序片段不能访问私有代码和数据。当代码或数据是公有的时,即使它们定义在对象内部,程序的其他部分能够访问到它们。一般情况下,对象的公有部分用来提供针对对象私有元素的控制接口。
Java封装的基本单元是类(class)。尽管在本书后文将对类进行详细介绍,但在此进行一些简单介绍也是有益的。类定义了对象的形式。它指定了数据和操作数据的代码。Java使用类的描述来构造对象(object)。对象是类的实例(instance)。所以,类在本质上是一个规划集合,这个集合指定创建对象的方式。
组成的代码和数据称为类的成员(member)。特别是,类中的数据称为成员变量(member variable)或实例变量(instance variable)。操作数据的代码称为成员方法(member method),或简称方法(method)。

1.5.2 多态

多态(polymorphism)这个词起源于希腊语,是“多种形态”的意思。多态这个性质允许我们仅通过一个接口来访问一类动作。而具体执行哪些动作由当时具体的情形决定。汽车的方向盘就是多态的一个简单例子。无论实际使用哪种方向盘,方向盘(也就是接口)都是一样的。即,无论汽车采用手动操作还是电动操作的方向盘,方向盘都同样工作。于是,一旦了解如何操作方向盘,就可以驾驶任意种类的汽车,而不用关心方向盘是如何实现的。
这个原则对编程也同样适用。下面就举一个简单的例子。比如创建一个接口,它定义一个称为get的操作,用从某种表单中获得下一项数据。这种获取下一项数据的动作,基于数据的存储方式,可以有很多实现方式。例如,数据项可能是以先进先出的顺序存储的,也可能是以先进后出的顺序存储的,或是以某种优先级存储的,还可能以许多其他方式存储。但是,只要某种存储机制实现了这个接口,用户就可以通过get方法来检索下一数据项。
更一般地,多态的概念可以表述为“一个接口,多种方法”。这意味着,有可能为一组相关的活动设计一个通用的接口。多态通过允许为一般动作使用同一接口来降低复杂度。而编译器会为每个应用场景选择特定的动作(即方法)。程序员无须手动做出选择,只须使用通用接口即可。

1.5.3 继承

继承(inheritance)是一个对象从另一个对象获取属性的过程。由于它支持按层级结构分类的概念,因此它非常重要。实际上世间绝大部分知识都是以按层次结构(即自顶向下)的分类管理的。例如,红富士苹果是苹果的一种,而苹果又是水果的一种,而水果又是食物的一种。换句话说,食物的所有品质(如可食用性、有营养等)都适用于水果;水果还有其独有的特征(如多汁、味甜等)。水果的独有特征使其与其他食物分离开来。苹果也定义了其独有的品质(如长在树上、非热带作物等)。依次地,红富士苹果也继承了前述大类的品质,还定义了一些使其独一无二的品质。
如果不使用继承,每个对象就只能显式定义所有特点。使用继承,对象只需在类中定义使其独一无二的品质。它能从其父类继承一般特性。于是,继承机制使得从一个更一般的情况来定义一个特别的实例对象成为可能。

时间: 2024-08-21 18:49:22

《Java 7程序设计入门经典》一1.5 面向对象编程的关键特性的相关文章

《Java 7程序设计入门经典》一导读

前 言 本书通过Java语言来讲解编程的基础知识.该书假设读者之前没有任何编程经验.本书首先介绍最基本的知识,例如,如何编译和运行Java程序:接着,讨论关键字.运算符和一些形成Java语言的构造.本书还会涉及Java的应用编程接口(Application Programming Interface,API)库.其中,包括Swing框架,它可以用来创建具有图形用户界面(Graphical User Interface,GUI)的程序.还包括集合框架,它可以用来存储对象集合.简而言之,本书旨在对J

《Java 7程序设计入门经典》一1.4 Java语言

1.4 Java语言 本书使用Java语言来讲解编程的基础知识.虽然其他编程语言也可以用来达到此目的,但是由于以下两个原因,本书选择了Java:首先,它是世界上使用最广泛的计算机语言之一.所以从实际的观点看,它是绝佳的学习语言.其次,它设计和实现了一些特性,这些特性使得对编程基础知识的介绍变得简单. 但是还有第三个原因.Java展现了现代编程的许多特点.对Java的理解可以使你像专业程序员一样看待和思考编程工作.它是这个时代定义的语言之一. 计算机语言演进是一个正在进行的历史过程,而Java是其

《Java 7程序设计入门经典》一3.1 从键盘输入字符

3.1 从键盘输入字符 到目前为止,本书中的示例程序都向用户显示信息,但不从用户接收信息.于是,只使用了控制台输出,没有使用控制台输入(即键盘输入).主要原因在于,许多Java输入需要依赖和使用本书还未讲到的特性.这些特性在后面才会提及.另外,在真实情况下,许多Java程序和applet是图形界面或是窗口界面的,而不是控制台的.因此,本书的例子很少使用控制台输入.但是,有一种控制台输入相对容易使用,那就是从键盘读入字符.因为本章有许多需要用到这个特性的例子,所以在这里讨论它们. 我们将用Syst

《Java 7程序设计入门经典》一1.1 计算基础

1.1 计算基础 考虑到你正在修一门编程课程,你可能已经对计算科学的基础知识有了一定的了解.但是,不是所有人都有同样的知识,或某些知识可能是不准确的.为此,在介绍Java语言之前,先介绍计算科学中的一些核心概念.在这个过程中,本章会定义一些关键术语. 1.1.1 计算机的硬件组成 由于计算机最终会运行编写的程序,因此了解计算机各部分运行的基本方式是有帮助的.任意一台计算机都由一系列的部件组成,它们协同运作,形成一个计算机整体.尽管计算机组成的部件随着时间推移不断演进,但是计算机仍有许多共同的关键

《Java 7程序设计入门经典》一第1章 Java编程基础 1.0

第1章 Java编程基础 本章要点 了解计算机的主要组成: 理解位.字节和二进制计数系统: 了解程序的两种形式: 了解Java的历史和设计理念: 理解面向对象编程的基本原则: 创建.编译并运行一个简单的Java程序: 使用变量: 使用if和for控制语句: 创建代码块: 理解语句是如何放置.缩进和结束的: 了解Java关键字: 理解Java标识符的规则. 仅仅在近十年的时间里,编程就从一门晦涩难懂的学科转变为现代社会不可或缺的一部分,从事编程工作的人也从少变多.其发展原因容易理解.如果仅仅用一个

《Java 7程序设计入门经典》一1.7 第一个简单的程序

1.7 第一个简单的程序 编译和运行一个简短的示例程序是开始介绍Java的诸多关键元素的最佳方法.我们将使用以下代码: 下面将运行以下三步: 1)输入程序: 2)编译程序: 3)运行程序. 1.7.1 输入程序 创建一个程序的第一步就是将源代码输入到计算机中.正如前面所介绍的那样,程序的源代码是程序可由人类阅读的形式.必须使用文本编辑器,而不是字处理软件将源代码输入到计算机中.字处理软件一般不仅存储文本信息,还存储格式信息.格式信息会使Java编译器困惑.源代码必须只包含文本.如果使用IDE,则

《Java 7程序设计入门经典》一1.17 Java类库

1.17 Java类库 本章展示的示例程序充分利用了Java的两个内置函数:println()和print().这些方法是System类的成员.System类是一个由Java预定义的类,它会自动添加到程序中.从更大的范围看,Java环境依赖于一些内置的类库(class library),它包含许多内置的方法,来提供对输入/输出.字符串处理.网络.图形用户界面等功能的支持.所以从总体来看,Java是其语言本身与其标准类的结合.之后将会看到,类库提供Java的许多功能.实际上,Java程序员需要学习

《Java 7程序设计入门经典》一2.5 变量的作用域和生命周期

2.5 变量的作用域和生命周期 直至现在,我们使用的所有变量都在main()方法开始处声明.但是,Java允许在块内声明变量.正如第1章介绍的那样,块以左花括号开始,以右花括号结束.块定义一个作用域(scope).于是,每次开始一个新块时,就创建一个新的作用域.作用域决定哪些对象对程序的其他部分可见.它还决定这些对象的生命周期. 许多其他计算机语言定义两种类型的作用域:全局作用域和局部作用域.尽管这对Java也勉强成立,但是这并不是对Java作用域进行分类的最好办法.Java最重要的作用域是由类

《Java 7程序设计入门经典》一3.17 习题

3.17 习题 1.写一个程序,从键盘读入字符,直到接收到一个英文句号(.).程序需要计算输入的空格的个数.在程序结束时输出总结果. 2.请写出if-else-if梯队的一般形式. 3.针对下列程序 其中最后的else子句与哪个if配对? 4.写一个for循环语句,从1000计数到0,步进值为-2. 5.下面的代码片段是否有效? 6.请解释break语句的用途(包括其两种形式.) 7.在下面的代码片段中,break语句执行后会显示什么? 8.下面程序片段的输出是什么? 9.for循环中的迭代表达