第 5 单元:您的第一个 Java 类
在 Eclipse 中创建和测试类
2016 年 10 月 11 日发布
开始之前
本单元是 “Java 编程入门”
学习路径的一部分。尽管各单元中讨论的概念具有独立性,但实践组件是在您学习各单元的过程中逐步建立起来的,推荐您在继续学习之前复习 前提条件、设置和单元细节。
单元目标使用 Eclipse Package Explorer 创建包和声明类
向类添加变量和方法
了解 Logger 类如何帮助您关注应用程序的行为
使用 Eclipse 代码生成器
创建一个 JUnit 测试案例并在 Eclipse 内运行它
您的 Person 类
您即将要创建和使用第一个 Java 类了 — 您目前在摘要中了解的同一个 Person
类。下面的视频演示了本单元的所有步骤。首先观看它,然后我将以文字形式简要复述这些步骤,同时更仔细地分析代码。
Java 编程入门,第 5 单元:您的第一个 Java 类
第 1 步:创建一个包
不使用默认包(几乎始终是一种不好的做法),而专门为您编写的代码创建一个包。单击 File > New >
Package 启动 Java Package 向导。将
com.makotojava.intro 键入到 Name 文本框中,然后单击
Finish。
第 2 步:声明类
现在可以在 Package Explorer 中看到您的新包。从这里创建类的最简单方式是,右键单击该包并选择 New >
Class...。在 New Class 对话框的 Name 文本框中,键入
Person,然后单击 Finish。
Eclipse 为您生成了一个 shell 类并在编辑窗口中显示了源代码:package com.makotojava.intro;
public class Person {
}
可选地,可以整理一下工作区,关闭不需要的视图。
第 3 步:添加内置记录功能
在进行进一步编码之前,您需要知道程序如何告诉您它们在做什么。
Java 平台包含 java.util.logging 包,这是一种以可读形式收集程序信息的内置记录机制。Loggers
是您通过对 Logger 类的静态方法调用所创建的指定实体:import java.util.logging.Logger;
//...
Logger l = Logger.getLogger(getClass().getName());
调用 getLogger() 方法时,您向它传递一个
String。就现在而言,只需要养成传递您编写的代码所在类的名称的习惯即可。对于任何普通(也即非静态)方法,前面的代码始终引用该类名并将它传递给
Logger。
如果您在一个静态方法内调用 Logger,可引用您所在的类的名称:Logger l = Logger.getLogger(Person.class.getName());
您所在的代码是 Person 类,所以您引用一个名为 class 的特殊字面常量,该常量检索
Class 对象(后面将更详细介绍)并获取其 Name 属性。添加记录代码,使
Person 现在看起来类似于:package com.makotojava.intro;
import java.util.logging.Logger;
public class Person {
Logger l = Logger.getLogger(Person.class.getName());
}
第 4 步:添加类变量
在 第 4 单元 中,您已看到如何开始扩充 Person
类,但我没有过多地解释语法。现在我将更正式地介绍如何添加类变量。
出于方便,清单 1 复制了您在第 4 单元中看到的 Person 类代码。
清单 1. 包含构造方法的
Person 类定义package com.makotojava.intro;
public class Person {
private String name;
private int age;
private int height;
private int weight;
private String eyeColor;
private String gender;
public Person() {
// Nothing to do...
}
public Person(String name, int age, int height, int weight String eyeColor, String gender) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
this.eyeColor = eyeColor;
this.gender = gender;
}
}
回想一下,一个变量有一个 accessSpecifier、一个
dataType、一个 variableName
和一个可选的 initialValue。在第 4 单元中,您简要了解了如何定义
accessSpecifier 和
variableName。
dataType 可以是原语类型或对另一个对象的引用。例如,在 清单 1 中可以注意到,age 是一个
int(原语类型),name 是一个 String(对象)。JDK
带来了大量有用的类,比如 java.lang.String,而且 java.lang
包中的类不需要导入(Java 编译器提供的一种速记形式)。但无论 dataType 是 JDK 类(比如
String)还是用户定义的类,语法都基本相同。
表 1 给出了您可能经常使用的 8 种原语数据类型,包括在您没有显式初始化一个成员变量的值时,采用的原语的默认值。
表 1. 原语数据类型类型大小默认值值范围boolean不适用falsetrue 或
false
byte8 位0-128 到
127
char16
位(无符号)\u0000' \u0000' 到
\uffff' 或 0 到 65535
short16 位0-32768 到
32767
int32 位0-2147483648 到
2147483647
long64
位0-9223372036854775808 到
9223372036854775807
float32
位0.01.17549435e-38 到 3.4028235e+38
double64 位0.04.9e-324
到 1.7976931348623157e+308
第 5 步:添加 getter、setter、构造方法和 main
方法
返回到 Person 的 Eclipse 源代码编辑器,添加以下代码中的第 3 到 7 行,以便您的类现在类似于:package com.makotojava.intro;
import java.util.logging.Logger;
public class Person {
Logger l = Logger.getLogger(Person.class.getName());
private String name;
private int age;
private int height;
private int weight;
private String eyeColor;
private String gender;
}
Eclipse 拥有一个方便的代码生成器来生成 getter 和 setter(以及其他方法)。右键单击 Package Explorer 中的
Person 类并选择 Source > Generate Getters and
Setters...。在 Generate Getters and Setters 对话框中,选择除
l(它表示记录器)的所有属性并单击 OK。
现在将清单 2 中的代码输入源代码窗口中,放在类定义的顶部部分(public class Person ()
下面一行)之下,从而向 Person 添加一个构造方法。
清单 2. Person
构造方法public Person(String name, int age, int height, int weight, String eyeColor, String gender) {
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
this.eyeColor = eyeColor;
this.gender = gender;
}
确保没有看到表明编译错误的波浪线。
使用 main() 作为测试工具
main()
是一个特殊方法,您可将它包含在任何类中,以便 JRE 可执行它的代码。类不是必须拥有 main() 方法
— 事实上,大部分类从来没有— 而且类最多只能有一个 main()
方法。main() 是一种值得拥有的方便方法,因为它为类提供了一个快速测试平台。在企业开发中,可以使用测试库,比如
JUnit,但使用 main() 可能是一种创建测试平台的应急方式。
第 6 步:生成一个 JUnit 测试案例
现在可以生成一个 JUnit 测试案例,在其中使用清单 2
中的构造方法实例化一个 Person,然后将该对象的状态打印到控制台。从这种意义上讲,“测试”
可确保调用的构造方法上的属性顺序是正确的(也即它们的设置为了正确的属性)。
在 Package Explorer 中,右键单击您的 Person 类,然后选择 New >
JUnit Test Case。在 New JUnit Test Case 向导的第一页,单击
Next 接受默认设置。在 Test Methods 对话框中 —
您在这里选择您希望向导为其构建测试的方法 — 仅选择构造方法并单击 Finish。Eclipse
然后将生成 JUnit 测试案例。
打开 PersonTest,进入 testPerson() 方法,使它看起来类似于清单
3。
清单 3. testPerson() 方法@Test
public void testPerson() {
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
Logger l = Logger.getLogger(Person.class.getName());
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
assertEquals("Joe Q Author", p.getName());
assertEquals(42, p.getAge());
assertEquals(173, p.getHeight());
assertEquals(82, p.getWeight());
assertEquals("Brown", p.getEyeColor());
assertEquals("MALE", p.getGender());
}
第 7 步:在 Eclipse 中运行单元测试
在 Eclipse 中,右键单击 Package Explore 中的 PersonTest.java 并选择 Run
As > JUnit Test。控制台视图将自动打开以显示
Logger 输出,JUnit 视图表明测试运行正常。
进一步探索
Dave Thomas、Andy Hunt 和 Jeff Langr 编写的 Java 8 中使用 JUnit 的实用单元测试
Kent Beck 编写的 JUnit 口袋书
Allen B. Downey 和 Chris Mayfield 编写的Java
编程思想(参阅第 11 章 “类”)
Cay Horstman 编写的 Java 核心技术(参阅 “第 4 课:对象和类”)