Java 核心与应用:Java 继承与多态
引言
“继承是代码复用的利器,多态是面向对象编程的灵魂。”
Java 作为一门面向对象的编程语言,继承与多态是其核心特性之一。理解这两者不仅能帮助你写出更优雅的代码,还能让你在面试中脱颖而出。本文将带你深入探索 Java 继承与多态的世界,从基础概念到高级应用,逐步揭开它们的神秘面纱。
🚀 学习目标
- 掌握继承关系的建立与使用场景
- 理解方法重写的限制条件与实现技巧
- 解析构造方法在继承链中的调用顺序
- 通过虚方法表理解动态绑定原理
- 学会在项目中应用组合优于继承原则
1. Java 继承基础
1.1 什么是继承?
继承是面向对象编程中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以复用父类的代码,并在此基础上进行扩展或修改。
1.1.1 继承的语法
class Animal {
void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Dog is barking");
}
}
在上面的代码中,Dog
类继承了 Animal
类,因此 Dog
类可以使用 Animal
类中的 eat()
方法。
1.1.2 继承的类型
Java 支持单继承,即一个类只能有一个直接父类。但可以通过多层继承实现类似多继承的效果。
继承类型 | 描述 |
---|---|
单继承 | 一个类只能有一个直接父类 |
多层继承 | 子类可以继承父类,父类又可以继承另一个类 |
1.2 方法重写(Override)
方法重写是子类对父类方法的重新实现。重写的方法必须与父类方法具有相同的方法签名(方法名、参数列表)和返回类型。
1.2.1 方法重写的规则
- 方法签名必须一致:方法名、参数列表必须与父类方法相同。
- 返回类型协变:子类方法的返回类型可以是父类方法返回类型的子类。
- 访问权限不能更严格:子类方法的访问权限不能比父类方法更严格。
- 异常限制:子类方法抛出的异常不能比父类方法抛出的异常更广泛。
// Animal.java
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
System.out.println("Animal构造器执行");
}
public void eat() {
System.out.println(name + "正在进食");
}
}
// Dog.java
public class Dog extends Animal {
// 继承语法
private String breed;
public Dog(String name, String breed) {
super(name); // 必须首先调用父类构造器
this.breed = breed;
System.out.println("Dog构造器执行");
}
@Override
public void eat() {
// 方法重写
super.eat(); // 调用父类实现
System.out.println(name + "正在啃骨头");
}
public void bark() {
System.out.println("汪汪!我是" + breed);
}
}
在上面的代码中,Dog
类重写了 Animal
类的 eat()
方法,因此 Dog
类调用 eat()
方法时,执行结果为:Dog .eat()
的结果。
重写规则对比表
特性 | 父类方法 | 子类重写方法 |
---|---|---|
访问修饰符 | protected | public/protected |
返回类型 | Animal | Dog(协变类型) |
异常声明 | IOException | 不声明或子异常 |
方法签名 | eat(String food) | eat(String food) |
static修饰 |