第三章:面向对象编程
3.4 继承与多态
3.4.1 继承的基本概念
继承是面向对象编程的三大特性之一(封装、继承、多态),它允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法。通过继承,子类可以复用父类的代码,并扩展新的功能。
语法示例:
class Animal { // 父类
void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal { // 子类
void bark() {
System.out.println("Dog is barking");
}
}
3.4.2 继承的类型
- 单继承:Java只支持单继承,即一个子类只能有一个直接父类。
- 多重继承(通过接口实现):虽然类不能多继承,但可以通过实现多个接口来达到类似效果。
3.4.3 方法重写(Override)
子类可以重写父类的方法以满足特定需求。重写时需遵循以下规则:
- 方法名、参数列表必须相同。
- 返回类型可以是父类方法返回类型的子类(协变返回类型)。
- 访问修饰符不能比父类更严格。
- 不能重写
private、final或static方法。
示例:
class Animal {
void makeSound() {
System.out.println("Animal sound");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow");
}
}
3.4.4 super关键字
super用于引用父类的成员(属性或方法),常用于:
- 调用父类的构造方法(
super()必须放在子类构造方法的第一行)。 - 访问被重写的父类方法。
示例:
class Parent {
String name = "Parent";
}
class Child extends Parent {
String name = "Child";
void printNames() {
System.out.println(super.name); // 输出 Parent
System.out.println(this.name); // 输出 Child
}
}
3.4.5 多态的实现
多态是指同一个行为具有多种表现形式,分为:
- 编译时多态:通过方法重载实现。
- 运行时多态:通过方法重写和父类引用指向子类对象实现。
示例:
Animal myAnimal = new Dog(); // 父类引用指向子类对象
myAnimal.makeSound(); // 调用的是Dog类重写的方法
3.4.6 instanceof操作符
用于检查对象是否是特定类或其子类的实例:
if (myAnimal instanceof Dog) {
Dog myDog = (Dog) myAnimal; // 向下转型
}
3.4.7 继承的优缺点
优点:
- 代码复用,减少冗余。
- 易于维护和扩展。
缺点:
- 过度使用会导致类层次复杂。
- 破坏封装性(子类依赖父类实现)。
3.4.8 实战练习
- 设计一个
Shape父类,包含draw()方法,派生出Circle和Rectangle子类并重写该方法。 - 使用多态实现一个方法,接受
Shape参数并调用其draw()方法。
下一节:3.5 接口与抽象类
