| 学习指南 EN
AP 计算机科学 A · AP Computer Science A · Using Objects / 使用对象 · 阅读约 12 分钟 · 更新于 2026-05-09

AP Computer Science A 使用对象 — 完整学习指南

适用对象:备考 AP Computer Science A 的中国学生。

本章覆盖:用 new 实例化对象、调用实例方法、String 类方法、Math 类方法、基本类型 vs 引用类型、自动装箱、变量作用域 — AP CS A Unit 2。

前置知识:基本类型与算术(Unit 1)。

关于练习题的说明:下文练习题均为我们按 AP CS A 风格原创的教学题。


1. 为什么使用对象重要

Unit 2 是从基本类型走向 OO 编程的桥梁。之前你只有 intdoublebooleanchar 四种基本类型。Unit 2 引入对象(类的实例)以及对其调用的方法。直接占 AP CS A 5-7.5%,但对象贯穿之后所有 unit。

两个根本转变:

  1. 引用类型 vs 基本类型 — 引用指向对象,不直接存值。
  2. 方法调用 vs 运算符 — s.length() 是方法调用;i + 1 是运算符。Unit 5(写类)你将编写本 unit 调用的方法。

2. 用 new 实例化

创建对象的写法:

String s = new String("hello");
Random r = new Random();

左侧变量持有引用(内存地址)。右侧调用构造器分配并初始化对象。赋值后 s 不存 "hello" — 它存指向 "hello" 所在地址的指针。

某些类(特别是 String)有字面量捷径:String s = "hello" 等价于 String s = new String("hello")(多数情况下)。

多个变量可指向同一对象:String t = s;st 互为别名 — 通过任一修改影响另一者(仅对可变对象)。

3. 调用实例方法

得到对象引用后,用点表示法调方法:

String s = "Hello, World!";
int len = s.length();         // 13
String upper = s.toUpperCase(); // "HELLO, WORLD!"
char c = s.charAt(7);         // 'W'

方法签名构成:

  • 接收者 — 方法运行在的对象(s)。
  • 名字lengthtoUpperCase 等。
  • 参数 — 圆括号内的值。
  • 返回值 — 方法返回的内容。

void 方法无返回值:s.intern()(少用)。

4. String 类 — AP 高频

必背方法(每年都考):

方法 返回 例子
length() int(字符串长度) "abc".length() → 3
charAt(i) i 位字符(0 起) "abc".charAt(1) → 'b'
substring(a) a 到末尾的子串 "hello".substring(2) → "llo"
substring(a,b) a(含)到 b(不含) "hello".substring(1,4) → "ell"
indexOf(c) 首次出现位置,无则 −1 "hello".indexOf('l') → 2
equals(other) true 若内容相同 "abc".equals("abc") → true
compareTo(other) int:<0、0、>0 "a".compareTo("b") → 负
concat(other) 拼接字符串 (或用 + 运算符)

字符串不可变s.toUpperCase() 返回新字符串,不修改 s。要保存变化必须重赋:s = s.toUpperCase()

5. Math 类 — 静态方法

Math 方法是静态的 — 不需要实例:Math.sqrt(25)不是 m.sqrt(25)

常用:

方法 返回 例子
Math.abs(x) 绝对值 Math.abs(-3) → 3
Math.pow(b,e) b^e(double) Math.pow(2,10) → 1024.0
Math.sqrt(x) 平方根(double) Math.sqrt(16) → 4.0
Math.random() 随机 double (int)(Math.random() * (b-a)) + a

6. 基本类型 vs 引用类型

基本类型intdoublebooleanchar — 直接存值。用 == 比较。值传递(复制副本)。

引用类型:以大写字母开头(StringIntegerint[]、自定义类) — 存内存地址。用 ==(同一引用?)或 .equals()(内容相同?)比较。引用本身的值传递(指针被复制;两份指针都指向同一对象)。

String s1 = "abc"; String s2 = "abc"; s1 == s2 有时 true(Java 字面量池),但 s1.equals(s2) 总是 true。AP 中字符串内容比较永远用 .equals()

自动装箱Integer i = 5; 自动把基本类型 5 转换为 Integer 对象。在只接受引用的集合(ArrayList<Integer>)中有用。

7. 例题精讲

下列代码输出什么?

String s1 = "Hello";
String s2 = s1;
s2 = s2 + " World";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1.length() + " vs " + s2.length());

解答

第 1 行:s1 指向 "Hello"。 第 2 行:s2 现在是 s1 的别名 — 两者都指向 "Hello"。 第 3 行:s2 + " World" 创建新字符串 "Hello World"。s2 重新指向新字符串。s1 仍指 "Hello"(字符串不可变 + 重赋值不影响 s1)。

输出:

Hello
Hello World
5 vs 11

8. 易错点

  • 字符串用 == vs .equals()"abc" == new String("abc")false(不同对象)。内容比较永远用 .equals()
  • 字符串不可变s.toUpperCase() 不改 s — 要重赋 s = s.toUpperCase()
  • substring/indexOf 偏一substring(a, b)b 不含"abcde".substring(1, 4) 是 "bcd" 不是 "bcde"。
  • 别名:把一个引用赋给另一个,两者指向同一对象。通过一者修改影响另一者(仅对可变对象,如数组)。

9. 练习题(CED 风格)

  1. 写代码段:给字符串 name,返回首字母大写、其余小写的版本(如 "hELLo" → "Hello")。
  2. String s = "abcabc";s.indexOf("c") 是多少?s.indexOf("c", 3)(从下标 3 开始查)呢?
  3. 用 Math 方法把 double x 四舍五入到百分位(如 3.14159 → 3.14)。

10. 速查表

  • new 实例化String s = new String("hello");(字面量捷径:String s = "hello";)。
  • 点调方法s.length()s.substring(2,5)
  • String 不可变:方法返回新字符串,不修改原值。
  • == 比引用;.equals() 比内容
  • Math 是静态Math.sqrt(x),无 new
  • substring(a,b)b 不含
  • 自动装箱自动把基本类型包成对象用于集合。

11. 下一步

使用对象铺垫 Unit 5(写类) — 创建自己的类与实例方法。Unit 7(ArrayList) 建立在 String[] 与同类引用类型之上。字符串处理 FRQ 高频,可问小欧:「教我用 substring/charAt 反转字符串」或「为什么我的 .equals() 在字符串看起来相同时返回 false?」

← 返回章节主页

某道题卡住了?
拍照或粘贴题目 — 小欧(我们的 AI 学习助手)会一步步讲解并配示意图。
免费试用小欧 →