Java 继承(Inheritance)
继承是面向对象编程的核心特性之一,它允许子类继承父类的属性和方法,实现代码复用和建立类之间的层次关系。理解继承是掌握面向对象编程的关键。本章将详细介绍 Java 中的继承机制。
单继承与继承链
什么是继承
继承(Inheritance)是子类继承父类的属性和方法,实现代码复用。
语法:class 子类 extends 父类
// 父类(基类、超类)
public class Animal {
protected String name;
protected int age;
public void eat() {
System.out.println(name + " 正在吃东西");
}
public void sleep() {
System.out.println(name + " 正在睡觉");
}
}
// 子类(派生类)
public class Dog extends Animal {
public void bark() {
System.out.println(name + " 在叫");
}
}
// 使用
Dog dog = new Dog();
dog.name = "旺财";
dog.eat(); // 继承自父类
dog.bark(); // 子类特有方法
Java 单继承
Java 只支持单继承,一个类只能继承一个父类。
// ✅ 正确:单继承
public class Dog extends Animal { }
// ❌ 错误:不能多继承
// public class Dog extends Animal, Mammal { }
为 什么单继承:
- 避免多重继承的复杂性
- 简化类层次结构
- 减少命名冲突
继承链
继承可以形成链式结构:
// 第一层:动物
public class Animal {
protected String name;
public void eat() {
System.out.println(name + " 吃东西");
}
}
// 第二层:哺乳动物
public class Mammal extends Animal {
public void giveBirth() {
System.out.println(name + " 是胎生");
}
}
// 第三层:狗
public class Dog extends Mammal {
public void bark() {
System.out.println(name + " 汪汪叫");
}
}
// 继承链:Animal -> Mammal -> Dog
Dog dog = new Dog();
dog.name = "旺财";
dog.eat(); // 来自 Animal
dog.giveBirth(); // 来自 Mammal
dog.bark(); // 来自 Dog
Object 类
所有类都继承自 Object 类(如果没有显式继承)。
// 等价于:public class Student extends Object
public class Student {
// ...
}
// Object 类的方法
Student student = new Student();
student.toString(); // 继承自 Object
student.equals(student); // 继承自 Object
student.hashCode(); // 继承自 Object
super 关键字
super 的作用
super 用于引用父类的成员(属性、方法、构造方法)。
访问父类属性
public class Animal {
protected String name = "动物";
}
public class Dog extends Animal {
private String name = "狗";
public void display() {
System.out.println(super.name); // 父类的 name:"动物"
System.out.println(this.name); // 子类的 name:"狗"
}
}
调用父类方法
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
public class Dog extends Animal {
@Override
public void eat() {
super.eat(); // 调用父类方法
System.out.println("狗吃骨头");
}
}
// 使用
Dog dog = new Dog();
dog.eat();
// 输出:
// 动物吃东西
// 狗吃骨头
调用父类构造方法
子类构造方法必须调用父类构造方法。
public class Animal {
protected String name;
protected int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age); // 必须调用父类构造方法
this.breed = breed;
}
}
规则:
super()必须是子类构造方法的第一条语句- 如果没有显式调用,编译器会自动调用父类的无参构造方法
- 如果父类没有无参构造方法,必须显式调用有参构造方法
public class Animal {
private String name;
// 只有有参构造方法
public Animal(String name) {
this.name = name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // 必须显式调用
}
// ❌ 错误:如果没有 super(name),会尝试调用 super(),但父类没有无参构造
}