| Learning Objective | Essential Knowledge |
|---|---|
3.1.A |
|
类的创建
AP 计算机科学 A · 第 3 主题
3.1
抽象与程序设计
大纲
来源:美国大学理事会 AP 课程与考试说明
抽象(abstraction)意味着把细节隐藏在一个简单的接口之后——你使用一个 String 而不知道它如何存储字符。好的设计把一个问题分解成类,每个负责一个思想。这个主题是关于写你自己的类。

| 英文 | 中文 | 拼音 |
|---|---|---|
| Abstraction | 抽象 | chōu xiàng |
3.2
程序设计的影响
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.2.A |
|
来源:美国大学理事会 AP 课程与考试说明
设计选择影响代码是否正确、可读和可重用。封装(encapsulation)——保持数据私有并只通过方法暴露它——保护一个对象的状态免于误用,并让你在不破坏类的用户的情况下改变里面。深思熟虑的命名、单一目的的方法和测试减少 bug。
设计还承担着代码之外的责任。系统可靠性(system reliability) - 一个程序按预期完成任务、不出故障 - 是程序员应当通过精心的设计和测试去最大化的。程序对社会、经济和文化有真实的影响,这些影响既可以有益也可以有害。而且创造程序会引发法律和知识产权(intellectual property)方面的顾虑:程序员常常重用作为开源(open source)发布、可免费使用的代码,但必须尊重它的许可证并给出署名,而不是把他人的成果当作自己的来抄。
| 英文 | 中文 | 拼音 |
|---|---|---|
| Encapsulation | 封装 | fēng zhuāng |
| System reliability | 系统可靠性 | xì tǒng kě kào xìng |
| legal and intellectual-property | 知识产权 | zhī shí chǎn quán |
| open source | 开源 | kāi yuán |
3.3
类的结构剖析
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.3.A |
|
来源:美国大学理事会 AP 课程与考试说明
一个类有三个部分:实例变量(instance variables)(字段——对象的数据)、构造函数(constructors)(构建对象),和方法(methods)(行为)。字段通常是 private;方法通常是 public:

public class Student {
private String name; // instance variable
private int score;
public Student(String n, int s) { // constructor
name = n;
score = s;
}
public int getScore() { return score; } // accessor
}

See an object's fields as boxes
A class groups related data (its fields) and methods. Each object gets its own set of field boxes; assigning to one changes that object only.
| 英文 | 中文 | 拼音 |
|---|---|---|
| instance variables | 实例变量 | shí lì biàn liàng |
| constructor | 构造函数 | gòu zào hán shù |
| accessor (getter) | 访问器 | fǎng wèn qì |
3.4
构造方法
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.4.A |
|
来源:美国大学理事会 AP 课程与考试说明
一个构造函数(constructor)有与类相同的名字且没有返回类型。它在你写 new 时运行,而它的工作是初始化字段。一个类能有几个带不同参数列表的构造函数(重载(overloading));一个无参数构造函数设置默认值。
| 英文 | 中文 | 拼音 |
|---|---|---|
| overloading | 重载 | zhòng zài |
3.5
方法:如何编写
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.5.A |
|
来源:美国大学理事会 AP 课程与考试说明
一个方法有一个签名、一个返回类型和一个主体。一个访问器(getter)(accessor)返回信息而不改变对象;一个修改器(setter)(mutator)改变一个字段。一个返回一个值的方法必须在每条路径上有一个正确类型的 return;一个 void 方法什么都不返回。
public void setScore(int s) { score = s; } // mutator
public String toString() { return name + ": " + score; }
Follow a method call and its return
Calling a method pushes a frame with its parameters; when it hits return, the frame pops and the value goes back to the caller.
| 英文 | 中文 | 拼音 |
|---|---|---|
| mutator (setter) | 修改器 | xiū gǎi qì |
3.6
方法:传递与返回对象引用
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.6.A |
|
来源:美国大学理事会 AP 课程与考试说明
= 复制的是引用,不是对象当你把一个对象传给一个方法时,Java 复制引用,所以方法作用于同一个对象——对它字段的变化对调用者可见。(基本类型按值复制,所以对它们的变化不可见。)一个方法也能返回一个对象的引用。因为一个 String 是不可变的,传一个是安全的;传一个可变的对象让一个方法能改变它。

考试技能: 知道在一个方法里面改变一个对象的字段影响原来的,但重新赋值参数(param = new...)不影响调用者。
Worked example. 假设 s 是一个分数为 50 的 Student,而我们调用 tweak(s):
public static void tweak(Student a) {
a.setScore(100); // (1) mutates the shared object
a = new Student("Z", 0); // (2) repoints the local copy only
a.setScore(5); // (3) changes only the new local object
}
第 (1) 行改变 s 指向的对象,所以调用者现在看到 100。第 (2) 行使方法自己的引用副本指向一个新的对象——调用者的 s 不受影响——而第 (3) 行只影响那个新对象。调用之后,s.getScore() 是 100:改变留住了,重新赋值没有。
3.7
类变量与类方法
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.7.A |
|
3.7.B |
|
来源:美国大学理事会 AP 课程与考试说明
一个静态(类)变量(static (class) variable),标记 static,被类的所有对象共享——总共一个副本(例如一个存在多少对象的计数器)。一个静态方法属于类而不能直接使用实例字段。按类名访问它们:Student.getCount()。
| 英文 | 中文 | 拼音 |
|---|---|---|
| static (class) variable | 类变量 | lèi biàn liàng |
3.8
作用域与访问权限
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.8.A |
|
来源:美国大学理事会 AP 课程与考试说明
作用域(scope)是一个名字可见的地方。一个在一个方法里声明的局部变量(local variable)只在它里面存在;一个参数(parameter)只在它的方法里存在;一个实例变量(instance variable)在整个对象里可见。访问修饰符控制跨类的可见性:private(只这个类)与 public(任何地方)。局部变量遮蔽(shadow)同名的字段——一个 bug 的来源。

| 英文 | 中文 | 拼音 |
|---|---|---|
| Scope | 作用域 | zuò yòng yù |
3.9
this 关键字
大纲
| Learning Objective | Essential Knowledge |
|---|---|
3.9.A |
|
来源:美国大学理事会 AP 课程与考试说明
this 是对当前对象的一个引用。用它来把一个字段与一个同名的参数区分开,或调用同一对象的另一个方法:
public Student(String name, int score) {
this.name = name; // this.name is the field; name is the parameter
this.score = score;
}
考试技能: 当一个构造函数或 setter 的参数与一个字段同名时,你必须写 this.field = param ——没有 this,赋值什么有用的都不做。
3.9
考试技巧
- 用方法和类设计:把数据封装为
private字段并通过公有方法暴露行为。 - 知道一个对象和它的类之间的差别,以及对象按值传递——参数得到引用的一个副本,所以一个方法能改变对象的状态,但重新赋值参数不影响调用者(Java 没有按引用传递)。
- 安全地遍历数组和
ArrayList——大小是lengthvs.size(),而在一个循环期间移除会移动索引。 - 跟踪一个递归方法以确定它的结果:先找到基本情况,然后沿着每次递归调用到它的返回值(写递归代码不在考试范围内)。
- 认识继承词汇——超类、子类、方法重写,以及每个类都是
Object的子类(设计和实现继承不在考试范围内)。
本主题的互动课程
逐步学习,并即时检测练习。