[Java 基础]面向对象-继承
继承,可以理解为和现实生活中的继承是一样的概念,比如:儿子继承了父亲的一些特性,面貌、身材、性格等。
在面向对象编程中,继承的概念与之类似。它允许我们创建一个新的类(子类 或 派生类),该类可以自动拥有另一个已经存在的类(父类 或 超类 或 基类)的属性(成员变量)和行为(成员方法)。子类可以在继承父类的基础上,添加自己特有的属性和行为,或者修改父类的行为。
继承的主要目的:
- 代码重用 (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 和 agethis.breed = breed;System.out.println("Dog 的构造方法被调用。");}public void bark() {System.out.println(name + " 正在汪汪叫!");}// 重写父类的 eat() 方法(Override)@Overridepublic 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 关键字,子类可以继承父类的非私有成员,并在此基础上扩展自己的功能。合理地使用继承可以使我们的代码更加简洁、易于维护和扩展。