🧠 什么是继承?
继承 是一种子类自动拥有父类成员(变量和方法)的机制,是 Java 中实现代码复用和多态的基础。
在 Java 中,使用 extends
关键字实现继承。
🧱 基本语法
class 父类 {
// 属性、方法
}
class 子类 extends 父类 {
// 子类自己的属性和方法
}
📦 示例:一个基础的继承案例
// 父类
public class Animal {
String name;
public void eat() {
System.out.println(name + " is eating.");
}
}
// 子类
public class Dog extends Animal {
public void bark() {
System.out.println(name + " is barking.");
}
}
// 测试类
public class Main {
public static void main(String[] args) {
Dog d = new Dog();
d.name = "Buddy";
d.eat(); // 从父类继承的方法
d.bark(); // 子类自己的方法
}
}
🧾 输出:
Buddy is eating.
Buddy is barking.
✅ 子类
Dog
继承了Animal
的name
和eat()
方法,同时也可以扩展自己的方法。
🎯 使用继承的典型场景
1. 代码复用
多个子类可以共享父类中通用的字段和方法,减少重复代码。
class Person {
String name;
void introduce() {
System.out.println("My name is " + name);
}
}
class Student extends Person {
void study() {
System.out.println(name + " is studying.");
}
}
2. 子类扩展/增强行为
子类可以添加自己的成员或重写父类的方法来扩展功能。
3. 多态实现基础
通过继承,Java 支持「父类引用指向子类对象」,这是多态的核心前提。
🔁 方法重写(Override)
子类可以重写父类的方法以实现不同的行为。
class Animal {
public void speak() {
System.out.println("Animal speaks");
}
}
class Cat extends Animal {
@Override
public void speak() {
System.out.println("Meow~");
}
}
注意事项:
-
方法签名必须一致
-
返回类型相同或为其子类型
-
建议加
@Override
注解,避免拼写错误或误用
🛡️ 继承中的访问控制
修饰符 | 同类 | 同包 | 子(孙)类 | 外部 |
---|---|---|---|---|
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ✅ | ❌ |
默认(无修饰) | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |
private
成员不能被继承访问,但可以通过protected
提供对子类开放的访问权限。
📌 构造函数与继承
子类不会继承父类的构造函数,但可以通过 super()
显式调用。
class Animal {
public Animal(String name) {
System.out.println("Animal: " + name);
}
}
class Dog extends Animal {
public Dog() {
super("Dog"); // 必须调用父类构造器
System.out.println("Dog constructor called");
}
}
⚠️ 常见误区与易错点
❌ 子类不能访问父类的 private
成员
class A {
private int value = 10;
}
class B extends A {
void show() {
// System.out.println(value); // 错误:value 是 private 的
}
}
✅ 解决:使用 protected
或 getter 方法访问。
❌ 子类不能继承多个父类(Java 不支持多继承)
// ❌ 错误示例(Java 不支持)
class A {}
class B {}
class C extends A, B {} // 编译错误
✅ 替代方案:使用**接口(interface)**实现多继承行为(见后续博客)
❌ 构造函数中必须手动调用父类构造器(如无默认构造函数)
class A {
public A(String msg) {}
}
class B extends A {
// ❌ 错误:没有调用 super(String)
public B() {
// super(); // 编译失败
}
}
✅ 实战建议:什么时候使用继承?
使用场景 | 是否建议继承 | 原因 |
---|---|---|
多个类有相同字段/行为 | ✅ | 代码复用 |
子类是父类的 “is-a” 类型 | ✅ | 合理建模(如 Dog is an Animal) |
需要扩展通用逻辑 | ✅ | 增强父类能力 |
类功能不一致但代码想复用 | ❌ | 建议使用组合(Has-a)代替继承 |
📚 总结一句话
Java 的继承是一种 “是一个(is-a)” 的关系,它让我们能以最小代价扩展功能、复用代码、实现多态。