Object 类
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 24 课,共 87 课。
在 Java 中,你创建的每个类都会自动继承一个名为 Object 的特殊类。即使你没有在任何地方写 extends,你的类仍然是 Object 的子类。这使得 Object 成为整个类层次结构的根。
public class Person {
// 这里隐式继承了 Object
}
// 等同于:
public class Person extends Object {
}由于每个类都继承自 Object,Java 中的每个对象都可以使用多个内置方法。最常用的方法包括:
| 方法 | 用途 |
|---|---|
toString() | 返回对象的字符串表示形式 |
equals(Object obj) | 比较两个对象是否相等 |
hashCode() | 返回对象的哈希码值 |
getClass() | 返回对象的运行时类 |
默认情况下,这些方法都有通用实现。例如,toString()会返回类名,后面跟着@和对象的十六进制哈希码,这并不太实用:
Person p = new Person();
System.out.println(p.toString()); // 输出:Person@1a2b3c4d这就是为什么你经常会在自己的类中重写这些方法,以提供有意义的行为。理解 Object 是通用父类,有助于解释为什么你可以在 Object 变量中存储任何对象,以及为什么你创建的每个对象都可以使用某些方法。
挑战
简单让我们通过构建一个简单的小工具库存系统,来了解 Object 类如何作为所有 Java 类的通用父类。这个系统会展示从 Object 继承的方法。
你将创建 3 个文件来组织代码:
Gadget.java:创建一个表示电子小工具的类。你的类应包含:name(String)和year(int)两个私有字段- 一个用于初始化这两个字段的构造函数
- Getter 方法
getName()和getYear()
Object中的任何方法,我们先来看看默认行为。Smartphone.java:创建一个继承Gadget的子类,并添加智能手机专属功能:- 一个私有字段
brand(String) - 一个接收 name、year 和 brand 的构造函数,父类部分使用
super(name, year) - 一个返回品牌的
getBrand()方法 - 重写
toString()方法,使其返回:Smartphone: [brand] [name] ([year])
- 一个私有字段
Main.java:展示默认的Object方法与重写后的方法之间的区别。你会收到 3 个输入:小工具名称、年份和品牌。使用相同的名称和年份分别创建一个Gadget和一个Smartphone(智能手机还要使用品牌),然后:- 使用
getClass().getSimpleName()输出小工具的类名 - 输出小工具的默认
toString()是否包含符号 "@"(输出true或false) - 使用重写后的
toString()输出智能手机
- 使用
你会收到 3 个输入:小工具或智能手机的名称(String)、年份(int)和品牌(String)。
这个挑战展示了为什么重写 Object 方法很重要:默认的 toString() 会返回类似 Gadget@1a2b3c 的内容,而自定义版本则会提供有意义的信息!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入
String name = scanner.nextLine();
int year = scanner.nextInt();
scanner.nextLine(); // 读取换行符
String brand = scanner.nextLine();
// TODO: 用 name 和 year 创建一个 Gadget 对象
// TODO: 用 name、year 和 brand 创建一个 Smartphone 对象
// TODO: 使用 getClass().getSimpleName() 输出 gadget 的类名
// TODO: 输出 gadget 的 toString() 是否包含 "@"(true 或 false)
// TODO: 输出 smartphone(使用重写的 toString())
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器