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 编程的桥梁。之前你只有 int、double、boolean、char 四种基本类型。Unit 2 引入对象(类的实例)以及对其调用的方法。直接占 AP CS A 5-7.5%,但对象贯穿之后所有 unit。
两个根本转变:
- 引用类型 vs 基本类型 — 引用指向对象,不直接存值。
- 方法调用 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; 中 s 与 t 互为别名 — 通过任一修改影响另一者(仅对可变对象)。
3. 调用实例方法
得到对象引用后,用点表示法调方法:
String s = "Hello, World!";
int len = s.length(); // 13
String upper = s.toUpperCase(); // "HELLO, WORLD!"
char c = s.charAt(7); // 'W'
方法签名构成:
- 接收者 — 方法运行在的对象(
s)。 - 名字 —
length、toUpperCase等。 - 参数 — 圆括号内的值。
- 返回值 — 方法返回的内容。
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 引用类型
基本类型:int、double、boolean、char — 直接存值。用 == 比较。值传递(复制副本)。
引用类型:以大写字母开头(String、Integer、int[]、自定义类) — 存内存地址。用 ==(同一引用?)或 .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 风格)
- 写代码段:给字符串
name,返回首字母大写、其余小写的版本(如 "hELLo" → "Hello")。 - 给
String s = "abcabc";,s.indexOf("c")是多少?s.indexOf("c", 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?」