继承,可以理解为和现实生活中的继承是一样的概念,比如:儿子继承了父亲的一些特性,面貌、身材、性格等。
在面向对象编程中,继承的概念与之类似。它允许我们创建一个新的类(子类 或 派生类),该类可以自动拥有另一个已经存在的类(父类 或 超类 或 基类)的属性(成员变量)和行为(成员方法)。子类可以在继承父类的基础上,添加自己特有的属性和行为,或者修改父类的行为。
继承的主要目的:
- 代码重用 (Code Reusability): 子类可以直接使用父类中已经定义好的属性和方法,避免了重复编写相同的代码,提高了开发效率。
建立类层次结构 (Establishing Class Hierarchy): 继承可以创建一种“is-a”(是一个)的关系,将相关的类组织成一个层次结构,使得程序结构更加清晰和易于理解。例如,“狗”是一个“动物”,“猫”也是一个“动物”,它们都继承了“动物”的一些通用特征。
- 提高代码的可维护性 (Maintainability): 当父类的属性或方法需要修改时,所有继承自该父类的子类也会自动继承这些修改。这简化了代码的维护工作。
- 实现多态性 (Polymorphism) 的基础: 继承是实现多态性的前提条件之一,多态性允许我们以统一的方式处理不同类型的对象。
如何在 Java 中实现继承?
在 Java 中,我们使用 extends 关键字来实现类的继承。语法如下:
class 子类名 extends 父类名 {
// 子类自己的属性和方法
}
关键概念:
- 父类 (Superclass/Base Class): 被继承的类
- 子类 (Subclass/Derived Class): 继承父类的类
- extends 关键字: 用于声明一个类继承另一个类
- 继承关系是单向的: 子类可以继承父类的成员,但父类不能继承子类的成员
- Java 只支持单继承: 一个类只能直接继承一个父类。但是,一个类可以实现多个接口(接口我们后面会学习)
- 继承的内容: 子类会继承父类中非 private 的属性和方法。private 的成员只能在父类内部访问,子类无法直接访问
- 构造方法不能被继承: 但是,子类的构造方法可以通过 super() 关键字调用父类的构造方法
代码示例:Animal 类和 Dog 类
让我们创建一个 Animal 类作为父类,然后创建一个 Dog 类作为 Animal 的子类来演示继承的概念:
// 父类:Animal
public class Animal {
String name;
int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Animal 的构造方法被调用。");
}
public void eat() {
System.out.println(name + " 正在吃东西。");
}
public void sleep() {
System.out.println(name + " 正在睡觉。");
}
}
// 子类:Dog,继承自 Animal
public class Dog extends Animal {
String breed; // 狗特有的属性
public Dog(String name, int age, String breed) {
super(name, age); // 调用父类的构造方法初始化 name 和 age
this.breed = breed;
System.out.println("Dog 的构造方法被调用。");
}
public void bark() {
System.out.println(name + " 正在汪汪叫!");
}
// 重写父类的 eat() 方法(Override)
@Override
public void eat() {
System.out.println(name + " 这只 " + breed + " 正在啃骨头。");
}
public static void main(String[] args) {
Dog myDog = new Dog("旺财", 3, "金毛");
// 子类继承了父类的属性和方法
System.out.println("名字:" + myDog.name);
System.out.println("年龄:" + myDog.age);
myDog.eat(); // 调用子类重写后的 eat() 方法
myDog.sleep(); // 调用父类的 sleep() 方法
// 子类自己特有的属性和方法
System.out.println("品种:" + myDog.breed);
myDog.bark();
}
}
继承是面向对象编程中实现代码重用和构建类层次结构的重要手段。通过 extends 关键字,子类可以继承父类的非私有成员,并在此基础上扩展自己的功能。合理地使用继承可以使我们的代码更加简洁、易于维护和扩展。