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
类的字段和方法。
继承的关系
在 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 中实现多态。
继承的类型
有五种类型的继承:
单一继承
在单继承中,单个子类从单个父类扩展而来。例如:
多级继承
在多级继承中,子类从父类扩展,然后同一个子类充当另一个类的父类。例如,
分层继承
在分层继承中,多个子类从单个父类扩展而来。例如:
多重继承
在多重继承中,单个子类从多个父类扩展而来。例如:
注意:Java 不支持多重继承。但是,我们可以使用接口实现多重继承。
混合继承
混合继承是两种或两种以上继承的组合。例如,
在这里,我们结合了层次继承和多重继承,形成了混合继承。