Java - 继承:初学者指南

你好,未来的Java巫师们!今天,我们将开始一段激动人心的旅程,深入了解Java的继承世界。如果你是编程新手,不用担心——我会成为你的友好向导,一步一步地解释一切。所以,拿一杯咖啡(或者你喜欢的茶),让我们开始吧!

Java - Inheritance

什么是继承?

想象一下你在创建一个家族树。你可能会注意到孩子们从父母那里继承了一些特征——也许是父亲的眼睛或者母亲的微笑。好吧,Java中的继承工作原理与此类似,但用的是类而不是家庭成员!

继承是面向对象编程(OOP)中的一个基本概念,它允许一个新的类基于一个现有的类。新的类从现有的类中继承字段和方法。

我们为什么需要继承?

  1. 代码重用性:我们可以重用现有的代码,而不是一遍又一遍地编写相同的代码。
  2. 改进的组织:它有助于创建清晰和逻辑的类层次结构。
  3. 方法覆盖:我们可以修改继承方法的行为。

让我们看一个简单的例子来更好地理解这一点。

实现Java继承

在Java中,我们使用extends关键字来实现继承。以下是一个基本结构:

class 父类 {
// 父类成员
}

class 子类 extends 父类 {
// 子类成员
}

现在,让我们看一个更具体的例子:

class 动物 {
void 吃() {
System.out.println("这个动物吃食物");
}
}

class 狗 extends 动物 {
void 叫() {
System.out.println("狗叫");
}
}

public class 继承示例 {
public static void main(String[] args) {
狗 我的狗 = new 狗();
我的狗.吃();  // 从动物继承
我的狗.叫(); // 在狗中定义
}
}

在这个例子中,类从动物类继承了吃()方法。当我们运行这个程序时,我们会看到:

这个动物吃食物
狗叫

这不是很整洁吗?我们的类现在有了动物类的吃()方法和自己的叫()方法!

'super' 关键字

现在,如果我们想在子类中引用父类呢?这时super关键字就派上用场了。这就像当你需要帮助时给父母打电话一样!

让我们修改一下我们的例子:

class 动物 {
void 吃() {
System.out.println("这个动物吃食物");
}
}

class 狗 extends 动物 {
void 吃() {
super.吃();  // 调用动物类的吃()方法
System.out.println("狗吃狗粮");
}
}

public class Super关键字示例 {
public static void main(String[] args) {
狗 我的狗 = new 狗();
我的狗.吃();
}
}

当我们运行这个程序时,我们会看到:

这个动物吃食物
狗吃狗粮

super关键字允许我们在添加自己的行为之前调用动物类的吃()方法。

调用父类构造函数

super关键字也可以用来调用父类的构造函数。当你想初始化继承的字段时,这特别有用。

class 动物 {
String 名字;

动物(String 名字) {
this.名字 = 名字;
}
}

class 狗 extends 动物 {
String 品种;

狗(String 名字, String 品种) {
super(名字);  // 调用动物类的构造函数
this.品种 = 品种;
}

void 显示() {
System.out.println("我的名字是 " + 名字 + " 我是一只 " + 品种);
}
}

public class 构造函数继承示例 {
public static void main(String[] args) {
狗 我的狗 = new 狗("巴迪", "金毛寻回犬");
我的狗.显示();
}
}

这将输出:

我的名字是巴迪我是一只金毛寻回犬

IS-A 关系

继承在类之间建立了一个"IS-A"关系。在我们的例子中,我们可以说是"A 狗 IS-A 动物"。这个关系是理解继承的基础。

'instanceof' 关键字

Java提供了instanceof关键字来检查一个对象是否是特定类或接口的实例。这就像问:"嘿,你是这个家庭的一部分吗?"

public class Instanceof示例 {
public static void main(String[] args) {
动物 我的动物 = new 动物();
狗 我的狗 = new 狗();

System.out.println(我的动物 instanceof 动物); // true
System.out.println(我的狗 instanceof 动物);    // true
System.out.println(我的动物 instanceof 狗);    // false
}
}

HAS-A 关系

虽然继承表示"IS-A"关系,但组合表示"HAS-A"关系。例如,一辆车有一个引擎。

class 引擎 {
void 启动() {
System.out.println("引擎启动");
}
}

class 车 {
private 引擎 引擎;

车() {
this.引擎 = new 引擎();
}

void 启动车() {
引擎.启动();
System.out.println("车准备好了!");
}
}

public class 组合示例 {
public static void main(String[] args) {
车 我的車 = new 车();
我的車.启动车();
}
}

Java继承的类型

Java支持几种类型的继承:

  1. 单继承:一个类从一个超类继承。
  2. 多级继承:一个类从一个类继承,而这个类又从另一个类继承。
  3. 层次继承:多个类从一个单一的超类继承。

Java不支持类的多重继承(一个类从多个类继承),以避免模糊性。但是,它确实通过接口支持多重继承。

以下是继承类型的总结表:

继承类型 描述 Java中是否支持
单继承 一个类从一个超类继承
多级继承 一个类从一个类继承,后者又从另一个类继承
层次继承 多个类从一个单一的超类继承
多重继承 一个类从多个类继承 否(但接口可以)

就这样,各位!我们已经介绍了Java继承的基础知识。记住,熟能生巧,所以不要犹豫,尝试这些概念。祝编程愉快,愿继承与你同在!

Credits: Image by storyset