Java 继承

继承是面向对象编程的关键特性之一,它允许我们从现有类创建新类。在本教程中,我们将借助示例了解 Java 继承以及继承的类型。

在本教程中,我们将借助示例了解 Java 继承以及继承的类型。

什么是继承

继承是 OOP 的关键特性之一,它允许我们从现有类创建新类。

通过继承创建的新类称为子类或派生类,被继承的类称为父类或基类或超类。

在 Java 中使用 extends 关键字表示继承。例如,

class Animal {
}

// Dog 类继承 Animal 类
class Dog extends Animal {
}

在上面的例子中, Dog 类继承了 Animal 类,就拥有了 Animal 类的方法和字段。

这里, Dog 类是子类, Animal 类是父类。

示例 1:Java 继承

class Animal {

  // 父类中的字段和方法
  String name;
  public void eat() {
    System.out.println("I can eat");
  }
}

// 继承自 Animal
class Dog extends Animal {

  // 子类中的方法
  public void display() {
    System.out.println("My name is " + name);
  }
}

public class Main {
  public static void main(String[] args) {

    // 创建子类对象
    Dog labrador = new Dog();

    // 子类对象访问父类的字段
    labrador.name = "Rohu";
    labrador.display();

    // 子类对象访问父类的方法
    labrador.eat();

  }
}

输出

My name is Rohu
I can eat

在上面的例子中,我们从父类 Animal 类派生了一个子类 Dog 类。注意下面的语句:

labrador.name = "Rohu";
labrador.eat();

这里, labrador 是一个 Dog 类的对象, 然而,name 字段和 eat() 方法属于 Animal 类。

Dog 类继承了 Animal 类, Dog 类的对象就可以直接使用 Animal 类的字段和方法。

子类 Dog 可以访问父类 Animal 的字段和方法。
Java继承实现

继承的关系

在 Java 中,继承中子类和父类的关系是:是一种 (is-a) 。也就是说,只有当两个类之间存在 is-a 关系时,我们才使用继承。例如,

  • 汽车是一种 (is a) 交通工具
  • 橙子是 (is a) 水果
  • 外科医生是一种 (is a) 医生
  • 狗是一种 (is a) 动物

在这里,汽车 可以从 交通工具 继承, 橙子 可以从 水果 继承,依此类推。

Java 继承中的方法覆盖

示例 1 中,我们看到子类的对象可以访问父类的方法。

但是,如果父类和子类中都存在相同的方法,会发生什么?

在这种情况下,子类中的方法会覆盖父类中的方法。这个概念在 Java 中称为方法覆盖。

示例 2:Java 继承中的方法覆盖

class Animal {

  // 父类中的方法
  public void eat() {
    System.out.println("I can eat");
  }
}

// Dog 继承了 Animal
class Dog extends Animal {

  // 覆盖父类的方法
  @Override
  public void eat() {
    System.out.println("I eat dog food");
  }

  // 子类中的新方法
  public void bark() {
    System.out.println("I can bark");
  }
}

public class Main {
  public static void main(String[] args) {

    // 创建子类的对象
    Dog labrador = new Dog();

    // 调用子类的方法
    labrador.eat();
    labrador.bark();
  }
}

输出

I eat dog food
I can bark

在上面的例子中, 父类 Animal 类和子类 Dog 类都有 eat() 方法。

我们创建了一个 Dog 类的对象 labrador,现在当对象 labrador 调用 eat() 时,就调用的是 Dog 类的方法,这是因为子类中的方法覆盖了父类中的方法。

这称为方法覆盖。要了解更多信息,请访问Java 方法覆盖

注意:我们使用 @Override 注解告诉编译器我们正在覆盖一个方法。但是, @Override 注解不是必须的。

要了解更多信息,请访问Java 注释

Java super 关键字

super 关键字用于从子类中调用父类的方法或构造方法。

比如之前我们看到子类中的相同方法覆盖了父类中的方法,如果还想调用父类中的同名方法,就可以使用使用 super 关键字来引用父类。

示例 3:继承中的 super 关键字

public class Animal {

  // 父类中的方法
  public void eat() {
    System.out.println("I can eat");
  }
}

// Dog 结成了 Animal
public class Dog extends Animal {

  // 覆盖父类的方法
  @Override
  public void eat() {
    // 调用父类的方法
    super.eat();
    System.out.println("I eat dog food");
  }

  // 子类中的新方法
  public void bark() {
    System.out.println("I can bark");
  }
}

public class Main {
  public static void main(String[] args) {

    // 创建子类的对象
    Dog labrador = new Dog();

    // 调用子类的方法
    labrador.eat();
    labrador.bark();
  }
}

输出

I can eat
I eat dog food
I can bark

在上面的例子中, 父类 Animal 类和子类 Dog 类都有 eat() 方法。注意子类中的下面一行代码:

super.eat();

这里, super 关键字用于调用存在于父类中的 eat() 方法。

我们也可以使用 super 关键字从子类的构造方法中调用父类的构造方法。要了解更多信息,请访问Java super 关键字

受保护的继承成员

在 Java 中,如果一个类包含 protected 字段和方法,那么该类的子类可以访问这些字段和方法。

示例 4:继承中受保护的成员

public class Animal {
  protected String name;

  protected void display() {
    System.out.println("I am an animal.");
  }
}

public class Dog extends Animal {

  public void getInfo() {
    System.out.println("My name is " + name);
  }
}

public class Main {
  public static void main(String[] args) {

    Dog labrador = new Dog();

    labrador.name = "Rocky";
    labrador.display();

    labrador.getInfo();
  }
}

输出

I am an animal.
My name is Rocky

在上面的例子中,我们创建了一个 Animal 类。该类包括一个 protected 字段 name 和一个 protected 方法 display()

Dog 类继承了 Animal 类,注意下面的代码:

labrador.name = "Rocky";
labrador.display();

在这里,子类对象可以直接使用父类对象的 protected 方法。

为什么要使用继承?

  • Java 中继承的最重要用途是代码可重用性。子类可以直接使用父类中存在的代码。
  • 我们可以借助继承在 Java 中实现多态。

继承的类型

有五种类型的继承:

单一继承

在单继承中,单个子类从单个父类扩展而来。例如:

A 类继承自 B 类。
Java 单继承

多级继承

在多级继承中,子类从父类扩展,然后同一个子类充当另一个类的父类。例如,

B 类继承自 A 类,C 类继承自 B 类。
Java 多级继承

分层继承

在分层继承中,多个子类从单个父类扩展而来。例如:

类 B 和 C 都继承自单个类 A。
Java 分层继承

多重继承

在多重继承中,单个子类从多个父类扩展而来。例如:

C 类继承自 A 类和 B 类。
Java 多重继承

注意:Java 不支持多重继承。但是,我们可以使用接口实现多重继承。

混合继承

混合继承是两种或两种以上继承的组合。例如,

B 类和 C 类继承自一个 A 类,D 类同时继承了 B 类和 C 类。
Java 混合继承

在这里,我们结合了层次继承和多重继承,形成了混合继承。