正在加载...

Java 中的继承

用 extends 创建子类型,以便使用写在父类上的方法。在 Car 上放 horn,让它打印 beep。写 class Truck extends Car。在 Yard.java 里创建一个 Truck 并调用 t.horn()。用 javac Yard.java 编译,运行 java Yard。屏幕应显示 beep。第二个演示还会创建一个普通 Car,让你看到有了子类之后父类仍然可用。把 super 留给下一页。此页不要在 Truck 上重写 horn——覆盖以后再说。

子类保留父类方法

paths 页用 Paths.get 命名位置。本页开始新模块:一个类可以是另一个类的子类。打开名为 Yard.java 的教学文件。保持 public 类名 Yard,与文件名一致。删除残留的 Route 路径演示、Store 写入、Reader 扫描器和任何键盘 Scanner。程序不应等待输入。本课不需要 import 行。
在 public 类上方声明 package-private 父类型:
class Car {
在 Car 内写实例方法 void horn(),打印 beep:
System.out.println("beep");
然后声明子类:
class Truck extends Car {
本页保持 Truck 体为空。子类不重写 horn。空花括号就足以说明 Truck 是一种 Car。
在 Yard.main 内创建 truck 并调用继承来的方法:
Truck t = new Truck();
t.horn();
调用能工作,因为 extends Car 把 Truck 连到 Car。你没有把 horn 复制进 Truck。

Yard Truck extends Car horn beep

java
class Car {
    void horn() {
        System.out.println("beep");
    }
}

class Truck extends Car {
}

public class Yard {
    public static void main(String[] args) {
        Truck t = new Truck();
        t.horn();
    }
}

在存放 Yard.java 的文件夹里运行 javac Yard.java。括号、花括号和分号配对正确时,javac 不会自己打印一行。然后运行 java Yard——不是 java Yard.java。运行命令不要带 .java 后缀。此文件只有一个 public 类,文件名与 Yard 一致。辅助类型 Car 和 Truck 在这种初学者写法里不带 public。一个文件里放三个 public 类会让 javac 拒绝——记住 classes 页的规则。
屏幕显示 beep。走一遍运行。Java 从 Yard.main 开始。new Truck() 创建 truck 对象。t.horn() 通过继承在父类 Car 上找到 horn。方法打印 beep。若 javac 说在 Truck 上找不到 horn,说明 extends Car 行缺失或拼错——补回去。若看到 note.txt 或路径打印,说明 Route 残留仍在启动——改用 java Yard。若终端等待输入,说明键盘 Scanner 还在文件里——删掉。
仔细写 extends。误用逗号或 implements 不是本课内容。此处的继承是子类型名与父类型名之间的关键字 extends。子类名在前:Truck extends Car,不要颠倒。
本页不要写 super。用 super 调用父构造器是下一课。也不要在 Truck 里写第二个 horn;覆盖的故事以后再说。今天子类保持为空,仍可使用父方法。空体是有意教学,不是用把 horn 抄进 Truck 来“修”的错误。

📊 Parent and child on this page

Piece Role
Car parent type that owns horn
Truck child type via extends Car
Yard public starter with main
horn prints beep; written only on Car

父类仍可单独使用

第二个程序保留同样的 Car、同样的空 Truck extends Car 和同样的 public Yard。在 main 里同时创建 Car 和 Truck,并在各自上调用 horn。

Yard Car and Truck both horn

java
class Car {
    void horn() {
        System.out.println("beep");
    }
}

class Truck extends Car {
}

public class Yard {
    public static void main(String[] args) {
        Car c = new Car();
        Truck t = new Truck();
        c.horn();
        t.horn();
    }
}

用 javac Yard.java 编译,再运行 java Yard。屏幕先显示 beep,再显示一次 beep。第一行来自普通 Car。第二行来自继承 horn 的 Truck。创建子类没有删除或破坏父类型。两个对象都能调用只在 Car 上写过一次的方法体。你仍要用 new 自己创建每个对象;extends 行不会自动造 truck。
这种对比是检查点。继承给已有方法增加子类路径。不必移除父类。若从 Truck 去掉 extends Car,t.horn() 将无法编译,因为 Truck 不再获得 horn。教学子类请保留 extends。想要一声安静的 beep 时用单 truck 文件。想证明父类仍能响应时用双对象文件。

与 Route 上的 paths 对比

paths 页上 java Route 命名文件夹和文件。本页 java Yard 用 extends 连接类型。若附近还有 Route 文件,只当历史保留;继承演示请运行 java Yard,让屏幕与本课一致。
extends、重用父方法和空子类体是新要素。你已从较早 OOP 页知道 new 和实例方法。今天这些部件在这条课程路径上第一次与继承相遇。保持教学名 Car、Truck 和 Yard,编译和运行命令才能短而清晰。

本页为 super 留下什么

本页展示不写 super 也能用父方法的子类。下一页引入 super,让子类有意与父类对话,尤其在构造器附近。此处坚持 extends 和继承来的 horn 调用。这些 Yard 演示上暂不要加 super() 要求。

super 之前

你可以写 Truck extends Car,创建 Truck,从 horn 看到 beep。也可以创建普通 Car,看到父类仍打印 beep。编译 Yard.java,对每个保留演示依次运行 java Yard。子类保持为空却仍用了父方法。下一页是 super,子类与父类对话更直接。
单 truck 演示留给清晰的继承调用。双对象演示用来证明父类单独仍可用。暂时不要把 super 放进本页。这三个习惯是继续前的检查点。当从未写过自己 horn 的 Truck 也出现 beep 时,继承完成了本课任务,你已准备好 super 主题。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部