目录
第1章 成为程序员 1.1 选择编程语言 1.2 告诉计算机做什么 1.3 程序的工作原理 1.4 为什么程序不能正常工作 1.5 选择 Java编程工具 1.6 安装 Java开发工具 1.7 总结 1.8 问与答 1.9 测验 1.9.1 问题 1.9.2 答案 1.10 练习 第2章 编写第一个程序 2.1 编写程序所需的工具 2.2 创建 Saluton 程序 2.3 开始输入程序 2.3.1 class语句 2.3.2 main语句的作用 2.3.3 大括号 2.4 在变量中存储信息 2.5 保存编写好的程序 2.6 将程序编译为 class文件 2.7 修复错误 2.8 运行 Java程序 2.9 总结 2.10 问与答 2.11 测验 2.11.1 问题 2.11.2 答案 2.12 练习 第3章 Java之旅 3.1 第一站:Oracle 3.2 去 Java学校 3.3 在 JavaWorld 用午餐 3.4 在 NASA仰望天穹 3.5 回归正题 3.6 到 Java Boutique 去问路 3.7 在手机上运行 Java 3.8 总结 3.9 问与答 3.10 测验 3.10.1 问题 3.10.2 答案 3.11 练习 第4章 理解Java程序的工作原理 4.1 创建应用程序 4.2 向应用程序传递参数 4.3 创建 applet 4.4 总结 4.5 问与答 4.6 测验 4.6.1 问题 4.6.2 答案 4.7 练习 第5章 在程序中存储和修改信息 5.1 语句和表达式 5.2 指定变量类型 5.2.1 整数和浮点数 5.2.2 字符和字符串 5.2.3 其他数值类型的变量 5.2.4 布尔型变量 5.3 给变量命名 5.4 在变量中存储信息 5.5 运算符 5.5.1 变量的递增与递减 5.5.2 运算符优先级 5.6 使用表达式 5.7 总结 5.8 问与答 5.9 测验 5.9.1 问题 5.9.2 答案 5.10 练习 第6章 使用字符串来交流 6.1 在字符串中存储文本 6.2 在程序中显示字符串 6.3 在字符串中使用特殊字符 6.4 拼接字符串 6.5 将其他变量用于字符串中 6.6 字符串的高级处理 6.6.1 比较两个字符串 6.6.2 确定字符串的长度 6.6.3 改变字符串的大小写 6.6.4 查找字符串 6.7 导演及演员名单 6.8 总结 6.9 问与答 6.10 测验 6.10.1 问题 6.10.2 答案 6.11 练习 第7章 使用条件测试进行判断 7.1 if语句 7.1.1 小于和大于的比较 7.1.2 相等和不等 7.1.3 使用块语句组织程序 7.2 if-else 语句 7.3 switch语句 7.4 条件运算符 7.5 观察时钟 7.6 总结 7.7 问与答 7.8 测验 7.8.1 问题 7.8.2 答案 7.9 练习 第8章 使用循环重复执行操作 8.1 for循环 8.2 while 循环 8.3 do-while 循环 8.4 退出循环 8.5 给循环命名 8.6 测试计算机的运行速度 8.7 总结 8.8 问与答 8.9 测验 8.9.1 问题 8.9.2 答案 8.10 练习 第9章 使用数组存储信息 9.1 创建数组 9.2 使用数组 9.3 多维数组 9.4 对数组进行排序 9.5 对字符串中的字符计数 9.6 总结 9.7 问与答 9.8 测验 9.8.1 问题 9.8.2 答案 9.9 练习 第10章 创建第一个对象 10.1 面向对象编程的工作原理 10.2 对象示例 10.3 什么是对象 10.4 理解继承 10.5 建立继承层次 10.6 转换对象和简单变量 10.6.1 简单变量的类型转换 10.6.2 对象类型转换 10.6.3 在简单变量和对象之间进行转换 10.6.4 自动封装和拆封 10.7 创建对象 10.8 总结 10.9 问与答 10.10 测验 10.10.1 问题 10.10.2 答案 10.11 练习 第11章 描述对象 11.1 创建变量 11.2 创建类变量 11.3 用方法来创建行为 11.3.1 声明方法 11.3.2 参数不同的类似方法 11.3.3 构造函数 11.3.4 类方法 11.3.5 方法中变量的作用域 11.4 将一个类放在另一个类中 11.5 使用关键字this 11.6 使用类方法和类变量 11.7 总结 11.8 问与答 11.9 测验 11.9.1 问题 11.9.2 答案 11.10 练习 第12章 充分利用现有对象 12.1 继承的威力 12.1.1 继承行为和属性 12.1.2 覆盖方法 12.2 建立继承 12.3 使用现有的对象 12.4 将相同类型的对象存储到 Vector 中 12.5 创建子类 12.6 总结 12.7 问与答 12.8 测验 12.8.1 问题 12.8.2 答案 12.9 练习 第13章 创建简单的用户界面 13.1 Swing 和抽象窗口工具包 13.2 使用组件 13.2.1 窗口和框架 13.2.2 按钮 13.2.3 标签和文本框 13.2.4 复选框 13.2.5 组合框 13.2.6 文本区域 13.2.7 面板 13.3 创建自己的组件 13.4 总结 13.5 问与答 13.6 测验 13.6.1 问题 13.6.2 答案 13.7 练习 第14章 用户界面的布局 14.1 使用布局管理器 14.1.1 GridLayout管理器 14.1.2 BorderLayout管理器 14.1.3 BoxLayout管理器 14.1.4 使用Insets将组件隔开 14.2 应用程序的界面布局 14.3 总结 14.4 问与答 14.5 测验 14.5.1 问题 14.5.2 答案 14.6 练习 第15章 响应用户输入 15.1 让程序监听 15.2 设置要监听的组件 15.3 处理用户事件 15.3.1 复选框和组合框事件 15.3.2 键盘事件 15.3.3 启用和禁用组件 15.4 完善图形应用程序 15.5 总结 15.6 问与答 15.7 测验 15.7.1 问题 15.7.2 答案 15.8 练习 第16章 创建复杂的用户界面 16.1 滚动窗格 16.2 滑块 16.3 变更监听器 16.4 使用图像图标和工具栏 16.5 总结 16.6 问与答 16.7 测验 16.7.1 问题 16.7.2 答案 16.8 练习 第17章 创建交互式Web程序 17.1 标准applet方法 17.1.1 在applet窗口中绘画 17.1.2 初始化applet 17.1.3 启动和停止applet 17.1.4 销毁applet 17.2 将applet放到Web页面中 17.3 创建applet 17.3.1 在applet窗口中绘画 17.3.2 测试SalutonApplet程序 17.4 从Web页面传递参数 17.5 在applet中接收参数 17.6 在applet中处理参数 17.7 使用object标记 17.8 总结 17.9 问与答 17.10 测验 17.10.1 问题 17.10.2 答案 17.11 练习 第18章 处理程序中的错误 18.1 异常 18.1.1 在try-catch块中捕获异常 18.1.2 捕获多种不同的异常 18.1.3 出现异常后进行处理 18.1.4 抛出异常 18.1.5 忽略异常 18.2 抛出和捕获异常 18.3 总结 18.4 问与答 18.5 测验 18.5.1 问题 18.5.2 答案 18.6 练习 第19章 创建线程程序 19.1 线程 19.1.1 降低程序的速度 19.1.2 创建线程 19.2 使用线程 19.2.1 声明类 19.2.2 创建变量 19.3 从init( )开始 19.4 在创建URL时捕获错误 19.5 在paint( )方法中处理屏幕更新 19.6 启动线程 19.6.1 运行线程 19.6.2 停止线程 19.7 处理鼠标单击 19.8 循环显示链接 19.9 总结 19.10 问与答 19.11 测验 19.11.1 问题 19.11.2 答案 19.12 练习 第20章 读写文件 20.1 流 20.1.1 文件 20.1.2 从流中读取数据 20.1.3 缓冲输入流 20.2 将数据写入流中 20.3 读写配置属性 20.4 总结 20.5 问与答 20.6 测验 20.6.1 问题 20.6.2 答案 20.7 练习 第21章 读写XML数据 21.1 创建XML文件 21.2 读取XML文件 21.3 读取 RSS 聚合内容(Syndication Feeds) 21.4 总结 21.5 问与答 21.6 测验 21.6.1 问题 21.6.2 答案 21.7 练习 第22章 利用JAX-WS开发Web服务 22.1 定义服务端点接口 使用注解来简化Java代码 22.2 创建服务实现Bean 22.3 发布Web服务 22.4 使用Web服务描述语言文件 22.5 创建Web服务客户端 22.6 总结 22.7 问与答 22.8 测验 22.8.1 问题 22.8.2 答案 22.9 练习 第23章 创建Java2D图形 23.1 使用Font类 23.2 使用Color类 23.3 创建自定义颜色 23.4 绘制直线和形状 23.4.1 绘制直线 23.4.2 绘制矩形 23.4.3 绘制椭圆和圆 23.4.4 绘制弧线 23.5 绘制饼图 23.6 总结 23.7 问与答 23.8 测验 23.8.1 问题 23.8.2 答案 23.9 练习 第24章 编写Android app 24.1 Android简介 24.2 创建 Android app 24.2.1 剖析一个Android新项目 24.2.2 创建app 24.2.3 安装Android模拟器 24.2.4 创建调试配置 24.3 运行app 24.4 设计真实的app 24.4.1 组织资源 24.4.2 配置app的Manifest文件 24.4.3 设计用户界面 24.4.4 编写Java代码 24.5 总结 24.6 问与答 24.7 测验 24.7.1 问题 24.7.2 答案 24.8 练习 附录A 使用NetBeans IDE A.1 安装NetBeans A.2 创建新项目 A.3 创建新的Java类 A.4 运行应用程序 A.5 修复错误 附录B Java资源 B.1 可以考虑的其他书 B.2 Oracle公司的 Java官方站点 B.3 其他Java站点 B.3.1 本书英文版的配套网站 B.3.2 Café au Lait B.3.3 Workbench B.3.4 Java 7 Developer Blog B.3.5 其他Java博客 B.3.6 InformIT B.3.7 Stack Overflow B.3.8 Java Review Service B.3.9 JavaWorld杂志 B.3.10 Developer.com’s Java Directory 附录C 本书站点 附录D 设置Android开发环境 D.1 起步 D.2 安装Eclipse D.3 安装 Android SDK D.4 安装在Eclipse中使用的Android插件 D.5 设置你的手机 其他 版权

Java初级教程

Java入门经典
第11章 描述对象

本章介绍如下内容:

为类或对象创建变量;

使用对象和类的方法;

调用方法并返回一个值;

创建构造函数;

给方法传递参数;

使用this来引用对象;

创建新对象。

上一章在介绍面向对象编程时讲到,对象是一种组织程序的方式,以便拥有完成任务所需的一切。对象由属性和行为组成。

属性是存储在对象中的信息,可以是整型、字符型或布尔变量,也可以是其他对象,如String对象和Calendar对象。行为是对象中用于处理特定任务的一组语句。每组语句称为一个方法。

到目前为止,读者在无意识的情况下使用了对象的方法和变量。如果语句中包含句点,但它不是小数点或字符串的一部分,则很可能使用了对象。

11.1 创建变量

本章将介绍一个名为Virus的类对象,它活着的唯一目标就是尽可能地繁殖,有点像我在大学时认识的人。为完成其工作,Virus需要执行多种操作,这些都被实现为类的行为。方法需要的信息将存储在属性中。

对象的属性提供了对象为完成其任务所需的变量。这些变量可以为简单数据类型,如整数、字符、浮点数,也可以为数组或类对象,如String和Calendar。对象的变量可以在对象所包含的任何一个方法中使用。按照惯例,在创建类语句之后,在创建方法之前,需要创建变量。

Virus对象需要一种方式指出文件已感染病毒。有些计算机病毒修改这样的字段,即存储文件最后修改时间的字段,例如,有些病毒将时间从13:41:20改为13:41:61。由于正常情况下,文件不可能在第 61 秒修改,因此该时间表明文件感染了病毒。Virus 对象在整型变量newSeconds中使用了86这个数值,由于秒数的最大值为60,因此在这个数值是不正确的。

下面的语句创建一个名为Virus的类,它有一个名为newSeconds的属性以及其他两个属性:

这3个变量都是类的属性,它们是newSeconds、maxFileSize和author。

在变量声明语句中指定public等关键字称为访问控制,因为它决定了其他类对象将如何使用该变量或它们是否可以使用这些变量。

将变量声明为public后,使用Virus对象的其他程序也可以来修改该变量的值。

例如,如果另外一个程序为数值92赋予了特别重要的意义,则它可以将newSeconds变量的值改为92。下面的语句。下面的语句创建一个名为influenza的Virus对象,并设置其变量newSeconds:

在Virus类中,变量author也是public的,因此也可以在其他程序中修改它的值。另一个变量masFileSize只能在其所属的类中使用。

将类中的变量声明为public时,该类将无法控制其他程序使用该变量的方式。在很多情况下,这可能不是问题。例如,可将author变量该为任何表示病毒作者的名字或假名。如果制造病毒的作者被起诉,则他的名字可能会出现在法庭文件中,所以不要用一个很傻的名字。

通过限制变量的访问权限,可避免因其他程序设置错误的值而导致错误。就 Virus 类而言,如果newSeconds被设置为60或更小,就不能成为报告文件是否感染病毒的可靠方式。因为有些文件无论是否感染病毒,都可能在那个秒数被保存。要避免 Virus 类出现这样的问题,需要做下面的两项工作:

将变量从public该为protected或private,后两者提供了更严格的访问限制;

添加修改变量值的行为以及向其他程序报告变量值的行为。

protected变量只能在其所在的类、该类的子类以及同一个包(package)的其他类中使用。包是一组用于完成相同目标的相关类。例如,java.util 包包含很多实用功能类,如日期和时间编程以及文件归档。通过在 Java 程序中使用 import 和*,如 import java.util.*,就可以在程序中使用包中的所有类。

private变量的访问限制比protected变量更严格,只能在其所属的类中使用。除非对变量做任何修改都不会影响类的功能,否则应将变量声明为private或protected。

下面的语句将变量newSeconds声明为private的:

如果要让其他程序能够使用变量newSeconds,必须创建行为,这将在本章后面介绍。

还有一种访问控制类型:创建变量时不指定public、privte或protected。

在本章之前创建的程序中,就没有指定上述任何关键字。没有指定访问控制类型时,变量只能在同一个包的类中使用。这被称为默认访问控制类型或包访问控制类型。

11.2 创建类变量

创建对象时,它将拥有相应类中所有变量的版本。每个 Virus 对象都有自己的 new Seconds、maxFileSize和author变量。如果修改对象的变量,将不会影响其他Virus对象中的同一个变量。

有时属性与整个类而不是特定对象相关联,它们称之为类变量。例如,如果要跟踪在程序中使用了多少个 Virus 对象,则可以使用一个类变量来存储这种信息。而且整个类只有该变量的一个拷贝。前面为对象创建的变量称为“对象变量”,因为它们与具体对象相关联。

这两种变量的创建方法和使用方法相同,但是创建类变量时指定使用关键字static。下面的语句为Virus类创建一个类变量:

修改类变量的方法与修改对象变量完全相同,如果有一个名为tuberculosis的Virus对象,可以使用下面的语句来修改类变量virusCount:

由于类变量用于整个类而不是特定对象,因此可以直接使用类名:

这两条语句完成相同的工作,但处理类变量时使用类名有个优点,即表明virusCount是个类变量而不是对象变量。如果引用类变量时使用对象名,在不仔细查看类的源代码的情况下,将无法确定是类变量还是对象变量。

类变量也称为静态变量。

警告:

尽管类变量很有用,但是也不要过度使用它。因为这些变量在类运行之时就会一直存在。如果类变量中存储的是一个大型的对象数组,则会占据很大的一块内存,而且不会将其释放掉。

11.3 用方法来创建行为

属性用于记录有关对象的信息,但是要让类实现它的目的,必须创建行为。行为描述了类中完成特定任务的不同部分,每部分都称为方法。

读者虽然没有意识到,但在前面的程序中一直在使用方法,尤其是 println( ),它在屏幕上显示文本。和变量一样,方法也是通过对象或类来使用的:在对象名或类名后跟句点和方法名,如 screen2D.drawString( )和 Integer.parseInt( )。

注意:

方法 System.out.println( )有点令人困惑,因为其中包含两个句点。这是因为其中涉及两个类:System和PrintStream。System类有一个名为out的变量,后者是一个 PrintStream对象,而 println( )是 PrintStream类的一个方法。因此,System.out.println( )语句的意思是,使用 System类的 out 变量的println( )方法。可以使用这种方法串接对变量和方法的引用。

11.3.1 声明方法

创建方法的语句与创建类的语句有点类似,它们都可以在名称后面的括号中指定参数,都使用大括号“{”和“}”指示开始和结束。不同之处在于,方法可以在执行完毕后返回一个值,返回值可以是简单类型(如整数或布尔值),也可以是对象。

下面是一个Virus类可用于感染文件的方法:

该方法接受一个参数——名为filename的字符串变量,该变量表示要攻击的文件。如果感染成功,success变量的值将被设置为true。

在方法开头的语句中,方法名infectFile前有boolean。该关键字指出方法执行完毕后将返回一个布尔值。实际用于返回值的是return语句,这里返回的是变量success的值。

如果方法不应该返回值,则方法名前面使用void关键字。

当方法返回值时,可以将其用于表达式中。例如,如果创建了Virus对象malaria,可以使用下面这样的语句:

返回值的方法可用于程序中任何可以使用变量的地方。

在本章前面,为防止其他程序读取或修改变量newSeconds,将其声明为private。但是也可以通过其他方式在别处使用newSeconds变量:在Virus类中创建读写newSeconds变量的public方法。不同于变量newSeconds本身,这些新方法应该是public的,这样其他程序才能调用它们。

请看下面两个方法:

这些方法称为accessor方法,原因是它们可以允许newSeconds变量被其他对象访问。

getSeocnds( )方法用于返回 newSeconds 变量的当前值,它没有任何参数,但是在方法名后面还需要要有一对括号。setSeconds( )方法接受一个参数:整型变量 newValue。该参数是是newSeconds的新值。如果newValue大于60,则进行修改。

在这个例子中,Virus类控制其他类如何使用newSeconds,这被称为“封装”,它是面向对象编程的基本概念。对象防止自己被误用的能力越强,在其他程序中使用它时越有用。

尽管 newSeconds 变量是 private,但是新方法 getSeconds( )和 setSeconds( )能够处理newSecond变量,原因是它们位于同一个类中。

11.3.2 参数不同的类似方法

正如读者在 setSeconds( )方法中看到的,可以向方法传递参数来影响其行为。在类中,不同的方法名称不同,但如果接受不同的参数,方法也可以同名。

如果两个方法接受的参数数量不同或参数类型不同,它们可以同名。例如,对于 Virus对象,有两个 tauntUser( )方法可能很有帮助。其中一个方法不接受任何参数,它发出通用的嘲笑(taunt),另一个接受指定嘲笑字符串的参数。下面的语句实现了这两种方法:

这两个方法具有相同的名字,但是参数不同:一个方法没有参数,另外一个方法有一个String 参数。传递给方法的参数称为方法签名(signature)。在每一个方法具有不同签名的前提下,类可以具有多个名字相同的不同方法。

11.3.3 构造函数

在程序中创建对象时,使用关键字new,如下所示:

这条语句创建一个名为typhoid的Virus对象。使用关键字new时,将调用类的一个特殊方法,该方法称为构造函数(constructor),因为它处理创建对象所需做的工作。构造函数用于设置对象正常工作所需的变量及方法。

定义构造函数的方式与其他方法类似,只是它不能像其他方法那样返回值。下面是Virus类的两个构造函数:

与其他方法类似,通过使用不同的参数,可以在同一个类中定义多个构造函数。在这里,像下面那样使用关键字new来创建对象时,将调用第一个构造函数:

仅当在new语句传递一个字符串参数和一个整型参数时,才会调用另一个构造函数,如下所示:

如果在类中不包含任何构造函数,将从超类那里继承一个不接受参数的构造函数。也可能继承其他构造函数,这取决于使用的超类。

使用new语句创建对象时,类中必须有一个这样的构造函数,即其参数数量和类型与new语句中指定的完全相同。在Virus类中,有两个构造函数:Virus( )和Virus(String name, int size),所以只能使用两种类型的new语句创建Virus对象:一种没有参数,另一种将一个字符串和一个整数作为参数。

11.3.4 类方法

与类变量相似,类方法提供与整个类而不是特定对象相关联的方法。当方法不影响单个对象时将其声明为类方法。一个这样的例子是前一章使用的 Integer 类的 parseInt( )方法,该方法用于将字符串转换为整型变量,如下所示:

这是一个类方法。要将方法声明为类方法,在方法名前使用关键字static,如下所示:

在本章前面,使用类变量 virusCount 来记录程序创建了多少个 Virus 对象。方法 show VirusCount( )是一个类方法,它显示创建的对象总数,可使用下面这样的语句来调用它:

11.3.5 方法中变量的作用域

当在类的方法中创建变量或对象时,它们只在该方法内可用,原因在于变量的作用域。作用域是变量可用的程序部分,离开作用域定义的程序部分,就不能使用该变量。

程序中的大括号“{”和“}”定义变量的范围。在大括号内创建的变量不能在大括号外使用,例如,请看下面的语句:

这个例子不能正常运行(在NetBeans中不能被编译),因为warning变量是在if块句的大括号之间创建的,这对括号定义了该变量的作用域。在这对大括号外,变量 warning 不存在,因此 System.out.println( )方法不能将它用作参数。

在一对大括号内又使用另一对大括号时,要注意使用的变量的作用域,请看下面的例子:

看到问题了么?在这个例子中,status变量可以在任何地方使用,但是为firstVirus变量赋值的语句将导致编译错误,因为 firstVirus 变量是在 if (infectedFiles < 1)语句内创建的,在后面的else语句中不存在。

要修复这种问题,必须在这两个语句块外创建firstVirus变量,这样其作用域将包含这两个语句块。一种解决办法是在创建status变量之后创建firstVirus变量。

作用域规则使程序更容易调试,因为作用域限制了变量的使用区域。这避免了在其他编程语言中最常见的一种错误:在程序的不同部分以不同的方式使用相同的变量。

作用域的概念也适用于方法,因为它们是用左大括号({)和右大括号(})定义的。在一个方法中创建的变量不能在其他方法中使用。如果变量是作为对象变量或类变量创建的,才可以在多个方法中使用。

11.4 将一个类放在另一个类中

虽然有时候Java程序也称为类,但很多时候一个程序需要多个类才能完成其工作。包含多个类的程序有一个主类和任意数目的助手类组成。

将程序分成多个类时,有两种方法可用于定义助手类。一种是独立地定义每个类,如下例所示:

在本例中,VirusCode 类被用作Wreaker类的助手类。通常在同一个.java源文件中定义助手类,因为它们是辅助类。源文件编译后,将生成多个类文件。上面的例子在编译时将生成文件Wreaker.class和VirusCode.class。

警告:

如果在同一个源文件中定义多个类,只能有一个类为public,在其他类的 class 语句中不能指定 public。另外,源文件的名称应与它定义的 public类的名称匹配。

创建一个主类和一个助手类时,也可以将助手类放在主类中。在这种情况下,助手类称为内部类。

内部类放在另一个类的左大括号({}和右大括号())之间。

内部类的使用方法与其他助手类相同,主要差别(除位置外)出现在编译之后。内部类没有使用class语句来指定名称,而是由编译器给它们指定名称,其中包含主类名。

在上一个示例中,编译器将生成Wreaker.class和Wreaker$VirusCode.class。

11.5 使用关键字this

由于可以同时引用其他类的变量和方法以及当前类的变量和方法,所以有时候引用的变量将不清楚。为使变量引用更清晰,一种解决办法是使用关键字this,它引用程序本身的对象。

使用对象的方法或变量时,将对象名放在变量名或方法名之前,并用句点隔开,请看下面的例子:

这些语句创建一个名为chickenpox的Virus对象,设置其chickenpox变量的名字,然后调用其 setSeconds( )方法。

在程序中有时需要引用当前对象,即程序本身代表的对象。例如,在 Virus 类中,可能有一个方法,该方法有自己的author变量:

在chickenpox()方法内存在一个名为author的变量,它不同于对象的变量author。如果要引用当前对象的author变量,必须使用关键字this,如下所示:

通过使用this,可以明确地指出了要引用的变量或方法。在类中,可以this代替对象名。例如,如果要将当前对象作为参数传递给方法,可以使用下面的语句:

在很多情况下,无需使用this就能清晰地引用对象的变量或方法。然而,使用this确保引用明确也没有什么害处。

当设置对象实例的变量值时,这个this关键字将在构造函数中发挥作用。来看具有author和maxFileSize变量的Virus对象,下面这个构造函数将会设置这两个变量:

11.6 使用类方法和类变量

在我们的律师的坚持下,这里将不再创建病毒程序,而创建一个简单的 Virus 对象,它可以统计程序创建的Virus对象数并报告该数目。

在 NetBeans选择 File->New File,创建一个新的 Java 空文件,将其命名为 Virus,然后在源代码编辑器中输入程序清单11.1中的内容。

程序清单11.1 Virus.java程序

在 NetBeans自动编译之后,保存该文件。这个类缺乏 main( )方法,因此不能直接运行。为了测试这个新的Virus类,需要再创建一个类,它能够创建Virus对象。

VirusLab类是一个简单的应用程序,它创建Virus对象,然后通过Virus类的getVirusCount( )方法来计算创建的对象数量。

在字处理程序中新建一个文件,输入程序清单 11.2 所示的内容,完成后将文件保存为VirusLab.java。

程序清单11.2 VirusLab.java程序

VirusLab 类是一个应用程序,运行时从命令行接受一个参数:要创建的 Virus 对象数。要在NetBeans中指定命令行参数,请执行如下操作。

1.选择 Run->Set Project Configuration->Customize,打开 The Project Properties对话框。

2.在 Main Class 字段输入“VirusLab”,在 Arguments 字段输入希望程序创建的 Virus对象的数量。

3.单击OK按钮关闭对话框。

以这种方式配置过程序之后,在NetBeans中选择Run->Run Main Project命令来运行该程序。

参数将使用发送给 main( )方法的字符数组读入到应用程序中。在 VirusLab 类中,这将在第2行执行。

为了将参数用作整数,必须将其从 String 对象转换为整数,这就需要使用 Integer 类的parseInt( )方法。在第 3 行,使用通过命令行传递给程序的第一个参数创建了一个名为 num Viurses的变量。

如果numViurses变量大于0,在VirusLab应用程序中将发生下列事情。

第5行:创建一个Virus对象数组,该数组的长度由numViruses变量指定。

第6~8行:用一个for循环为数组中的每个Virus对象调用构造函数。

第 9~10 行:创建完所有 Virus 对象后,使用 Virus 类的 getVirusCount( )方法计算创建了多少个对象,这应该与运行应用程序VirusLab时在命令行输入的参数相同。

如果numViruses变量不大于0,应用程序VirusLab将什么都不做。

编译文件VirusLab.java后,使用任何命令行参数测试该应用程序。可创建的Virus对象数量与取决于运行VirusLab应用程序的计算机系统的可用内存量。在作者的计算机系统上,超过5.5×106个Virus对象时,将导致程序显示消息“OutOfMemoryError”,然后崩溃。

如果指定的Virus对象数量小于你的系统可以处理的数量,则输出应该会如图11.1所示。

图11.1 VirusLab 程序的输出

11.7 总结

至此,读者已经学完了本书三章面向对象编程内容中的两章。你学习了如何创建对象、为对象和类定义行为和属性,以及如何使用类型转换将对象和变量转换为其他类型。

以对象的方式思考是学习Java编程语言面临的严峻挑战之一。然而,理解对象后,将意识到整个Java语言都是利用了对象和类。

下一章将介绍如何为对象指定父对象和子对象。

11.8 问与答

问:为了使用类变量或类方法,必须创建一个对象吗?

答:由于类变量和类方法不与特定对象相关联,不需要仅为使用它们而创建对象。 Integer.parseInt( ) 方法的使用就是一个例子,你不需要为将字符串转换为整数而创建一个新的Integer对象。

问:有没有Java支持的所有内置方法的列表?

答:Oracle提供了Java语言中所有类的完整文档,包括你使用的所有公有方法。该文档位于http://download.oracle.com/javase/7/docs/api。

11.9 测验

回答下面的问题,以检测你是否有理解面向对象编程技术所需的属性和行为。

11.9.1 问题

1.在Java类中,方法是一种什么?

a.属性。

b.语句。

c.行为。

2.要将变量声明为类变量,创建它时必须使用什么关键字?

a.new。

b.public。

c.static。

3.变量可用的程序部分称为什么?

a.窝。

b.作用域。

c.变量流域。

11.9.2 答案

1.c.方法是由语句组成的,但它是一种行为。

2.c.如果不指定关键字static,将为对象变量而不是类变量。

3.b.在变量的作用域外使用变量时,编辑器将会提示错误。

11.10 练习

如果谈论病毒没有让你生病,可通过下面的练习加深对本章主题的理解:

在Virus类添加一个private变量,它用于存储整数,名为newSeconds。创建两个方法,其中一个返回变量newSeconds的值;另一个在提供的新值位于60和100之间时,将变量newSeconds设置为提供的值。

编写一个Java应用程序,它接受一个字符串参数,并依次将其转换为float变量、Float对象和int变量。使用不同的参数运行程序多次,看看结果如何。

有关为完成这些练习而编写的Java程序,请访问本书的配套网站www.java24hours.com。

没有精选讨论主题。

全部讨论主题 查看精选主题

没有讨论主题。
😃 😅 😆 😁 😂 😊 😄 😠 😩 😲 😞 😵 😰 😒 😍 😤 😜 😝 😋 😘 😚 😷 😳 😢 😭 😨 😣 😡 😌 😖 😔 😱 😪 😏 😓 😥 😫 😉 👊 👍 👆 👇 👈 👉 👋 👏 👌 👎 👐 💓 💔 💕 💖 💗 💘 💙 💚 💛 💜 💝 💞 💟