Menu
CoddyTech

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 变量中存储任何对象,以及为什么你创建的每个对象都可以使用某些方法。

challenge icon

挑战

简单

让我们通过构建一个简单的小工具库存系统,来了解 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())
        
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Java 在线编译器