英语原文共 719 页,剩余内容已隐藏,支付完成后下载完整资料
结论:
在看完本章后,你应该能够:
bull;解释“面向对象”一词的含义;
bull;解释和区分类和对象;
bull;用Java创建对象;
bull;调用对象的方法;
bull;使用String类的方法;
bull;创建和使用数组对象;
bull;创建一个ArrayList对象,使用ArrayList类的add和get方法。
7.1介绍
在20世纪90年代,使用类和对象这种特殊结构成为一些编程语言的规范。这些语言被称为面向对象编程语言。在这一章和下一章,我们将解释这些术语的含义,展示Java等面向对象编程语言的强大功能。
7.2数据类型——类
到目前为止,你已经使用过诸如char、int、double等数据类型。这些都是存储单一信息的简单数据类型。但是如果我们想用一个变量来保存多个相关信息呢?以一本书为例,一本书可能有一个标题,一个作者,一个ISBN编码和一个价格;或者一个学生可能有一个名字,一个学号和各科目的分数。诸如char和int等数据类型只能存储一个信息,因此它们不能存储一本书或一个学生的所有必要信息。数组也不能,因为所有必要信息不一定都是同一类型的。早期的语言,如C和Pascal通过创建一个存储多个信息的类型解决了这个问题。这种类型在不同的语言中有不同的名称,最常见的名称是结构和记录。
然而,Java、c 等面向对象语言则更进一步。在面向对象语言中,我们不仅能够创建存储许多数据的类型,而且还可以在类型中定义处理数据的方法。例如,一本书“类型”可能有一个计算税后销售价格的方法,一个学生“类型”可能有一个计算平均分的方法。
你还记得第二章末的练习吗?程序要求用户提供一个矩形的长度和宽度,然后显示矩形的面积和周长。在第五章中,有一道练习题要求调整以下程序,使程序用独立的方法来执行计算。程序可能是这样的:
import java.util.Scanner;
public class RectangleCalculations
{
public static void main(String[] args)
{
double length, height, area, perimeter;
Scanner keyboard = new Scanner(System.in);
System.out.print('What is the length of the rectangle? '); // 提示输入矩形的长
length = keyboard.nextDouble(); // 获取用户的输入
System.out.print('What is the height of the rectangle? '); // 提示输入矩形的宽
height = keyboard.nextDouble(); // 获取用户的输入
area = calculateArea(length,height); //调用calculateAr
方法
perimeter = calculatePerimeter(length,height); // 调用calculatePerimeter 方法
System.out.println('The area of the rectangle is ' area); //显示面积
System.out.println('The perimeter of the rectangle is ' perimeter); //显示周长
}
// 计算面积的方法
static double calculateArea(double lengthIn, double heightIn)
{
return lengthIn * heightIn;
}
// 计算周长的方法
static double calculatePerimeter(double lengthIn, double heightIn)
{
return 2 * (lengthIn heightIn);
}
}
你能看到它有多有用吗?当我们要写一个程序处理矩形时,我们可以使用矩形“类型”,创建一个变量,调用预先编写的方法,而不是一定要声明几个变量和写几个方法来计算矩形的面积和周长。实际上,你甚至不需要知道这些计算是如何执行的。
这正是像Java这样的面向对象语言所允许我们做的。现在,你可能已经猜到了,这个包含了数据和方法的特殊结构称为类。你已经看到过一个类,即包含主方法和任何其他方法的基本单元。现在我们可以用一个类来定义新的“类”。
你可以看到一个类包含两个方面:
bull;存储数据;
bull;执行任务。
在下一章,你将看到类所包含的数据项被称为类的属性,正如我们所看到的,执行的任务被称为类的方法——在第五章,你已经知道如何定义方法。但是,在第五章中,只是调用一个类内部的方法。现在我们来看看如何调用另一个类的方法。事实上,你已经在不知不觉中这样做了——因为从第二章开始,你就一直在调用Scanner类的方法!
7.3对象
为了使用类的方法,你需要创建该类的对象。为了理解类和对象之间的区别,你可以把类想象成一个蓝图或模板,从其中生成对象,而对象引用该类的一个实例。例如,设想一个书店系统。书店里会有好几百本书——但我们不需要定义一本书几百次。我们首先定义一本书(在类中),然后从这个蓝图中生成任意多的对象,每个对象代表一本书。
如图7.1所示。
图7.1从一个类中生成多个对象
一个程序可能包括许多类,因为我们可能希望生成多种对象。一个书店系统可能有书、顾客、供应商等类。一个大学管理系统可能有学生、课程、老师等类。
因此,面向对象编程包括定义一个或多个可以相互交互的类。
现在,我们将通过创建和使用预定义类的对象来演示这一切——由我们自己定义的类或Java开发工具包的标准部分提供的Java开发人员定义的类。我们从7.2节的例子开始分析。在这个例子中,我们提出了用一个“类型”来计算矩形的面积和周长。事实上我们不会把新类命名为Rectangle,而是Oblong。这样做的原因是,在“内置”Java库中定义的Rectangle类不止一个。虽然完全可能有多个相同名称的类,但在这个阶段时最好避免任何可能的混淆。在第十九章,你将学到如何避免命名冲突,但现在最好使用唯一的名称命名我们的新类。
这里有一个“有趣的事实”——实际上Rectangle和Oblong并不一样。Oblong的长和宽一定是不相等的,而Rectangle可以有四条相等的边。换句话说,正方形是一种Rectangle而不是一种Oblong。
7.4 Oblong类
我们为你写了一个Oblong类。我们创建的类保存在Oblong.java文件,在网站上下载这个文件后可以使用此类。你要确保它的存放位置能够被编译器找到。而且你也要根据所使用的特定IDE的规则将其放入你的项目中。
在下一章,我们将深入了解这个类,了解它是如何编写的。但是现在,你可以完全忽略程序代码,因为你可以在不了解任何细节的情况下使用类。
一旦你被提供了这个Oblong类,就不是仅限于做这样的简单声明:
int x;
你就可以做如下声明:
Oblong myOblong;
你可以看到这行代码类似于一个变量的声明;然而我们的这行代码并不是声明一个基本数据类型(如int)的变量,而是声明了类(Oblong)的对象(myOblong)的名称——实际上,我们已经创建了一个新的类型,Oblong类。
你需要确保你理解这行代码的实际作用。实际上它创建一个变量,保存对对象的引用,而不是对象本身。正如在前一章中所解释的,引用是内存中的某个地址。在这个阶段,我们还没有为Oblong类的对象分配内存空间,而只是将一个内存地址命名为myOblong,如图7.2所示。
图7.2声明一个对象的引用
现在,你当然会问:“Oblong类对象的内存空间是如何被创建的?这个对象是如何与myOblong引用联系起来的?”
正如我们所指出的,一个对象通常被称为一个类的实例; 创建对象的过程也被称为实例化。为了创建一个对象,我们需要使用类的一个非常特殊的方法,即构造函数。
构造函数是与类同名的方法。当你创建一个新的对象时,会自动调用构造函数。它的作用是在计算机的内存中分配足够大的空间来存放所需的对象 (这个例子中的Oblong类的对象)。
我们将在下一章看到,构造函数可以被定义为执行其他事务,和分配内存空间。在我们的Oblong类中,构造函数被定义好,以便每次创建一个新的Oblong对象时,长和宽由类的用户指定数值。所以每次你创建一个Oblong对象时,你必须指定它的长和宽的大小。例如,调用构造函数,创建一个长7.5,宽12.5的Oblong对象:
myOblong = new Oblong(7.5, 12.5);
这是为一个新的Oblong对象分配内存空间的声明。使用关键字new和构造函数为新的Oblong对象分配内存空间。现在,在Oblong类的例子中,开发它的人(在本例中是我们!)定义了构造函数。它需要两个double类型的数据项作为参数传递数据。在这里,我们输入了数字7.5和12.5。新的对象的地址存储在名为myOblong的位置中。如图7.3所示。
图7.3创建一个新的对象
现在每次我们想要引用这个新的Oblong对象时,可以使用变量名myOblong。
与简单类型的声明和初始化一样,Java也允许我们在一行代码中声明一个引用和创建一个新对象:
Oblong myOblong = new Oblong(7.5, 12.5);
我们可以用各种各样的方法定义构造函数(例如,在BankAccount类中,我们可能希望在创建帐户时将特定的值设置为透支额度),我们将在接下来的过程中看到这些方法的示例。
当然你们已经看到了其中的另一个例子,也就是Scanner类:
Scanner keyboard = new Scanner(System.in);
现在你可以理解这行代码是如何通过调用构造函数创建一个新的Scanner对象keyboard了吧。我们输入的参数System.in赋值给keyboard对象,通过使用此参数,将新的Scanner对象和keyboard引用联系起来。
你将在下一章看到,当我们编写一个类时,要确保程序不可以直接给属性赋值。这样类中的数据是被保护起来的。这种保护数据的方式被称为封装。与数据交互的唯一途径是调用类的方法。
这意味着,为了使用一个类,我们需要知道方法的细节:方法名,方法的作用,以及方法的输入和输出。换句话说,你需要知道这个方法的参数和返回值类型。一旦我们知道了这些,我们就可以通过使用方法与类进行交互——理解这一点很重要,因为只有调用类的方法,我们才能与类进行交互。
表7.1列出了Oblong类的所有方法及其输入和输出——包括构造函数。
表7.1 Oblong类的方法
方法 |
描述 |
输入 |
输出 |
Oblong |
构造函数 |
两个double类型数据 |
—— |
setLength |
设置矩形的长 |
一个double类型数据 |
无 |
setHeight |
设置矩形的宽 |
一个double类型数据 |
无 |
getLength |
获取矩形的长 |
无 |
一个double类型数据 |
getHeight |
获取矩形的宽 |
无 |
一个double类型数据 |
calculateArea |
计算矩形的面积 |
无 |
一个double类型数据 |
calculatePerimeter |
计算矩形的周长 |
无 |
一个double类型数据 |
就Oblong类而言,正如预期的那样,我们提供了两种方法,分别返回矩形的面积和周长。然而,如果我们没有办法给出矩形的长和宽,这个类
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[235392],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。