第一部分:继承基础概念

继承是面向对象编程的三大特性之一,允许子类继承父类的属性和方法

学习目标

理解继承的概念,掌握extends关键字的用法,区分继承与组合

1

什么是继承

继承是一种"is-a"关系,子类是父类的一种特殊类型:

// 父类:动物 public class Animal { protected String name; protected int age; public void eat() { System.out.println("动物在吃食物"); } } // 子类:狗 继承自动物 public class Dog extends Animal { private String breed; public void bark() { System.out.println("汪汪叫"); } }
2

继承的语法规则

  • 使用 extends 关键字实现继承
  • Java只支持单继承,一个类只能继承一个直接父类
  • 子类继承父类所有非private的属性和方法
  • 构造方法不能被继承
注意:Java不支持多继承,但支持多层继承(A→B→C)

第二部分:super关键字详解

super关键字用于访问父类的成员,解决子类与父类成员冲突问题

学习目标

掌握super的三种用法:访问属性、调用方法、调用构造方法

1

super访问父类属性

public class Parent { protected int value = 100; } public class Child extends Parent { private int value = 200; public void printValues() { System.out.println("子类value: " + value); // 200 System.out.println("父类value: " + super.value); // 100 } }
2

super调用父类方法

public class Parent { public void show() { System.out.println("这是父类的方法"); } } public class Child extends Parent { @Override public void show() { super.show(); // 调用父类方法 System.out.println("这是子类的方法"); } }
3

super调用父类构造方法

public class Parent { public Parent(String name) { this.name = name; } } public class Child extends Parent { public Child(String name, int age) { super(name); // 必须是第一条语句 this.age = age; } }

规则:super()必须是子类构造方法的第一条语句

第三部分:方法重写与内存分析

深入理解方法重写机制及继承关系的内存布局

学习目标

掌握方法重写规则,理解继承的内存分配过程

1

方法重写(Override)规则

public class Animal { public void makeSound() { System.out.println("动物发出声音"); } public Animal getAnimal() { return new Animal(); } } public class Dog extends Animal { @Override // 可选但推荐的注解 public void makeSound() { System.out.println("汪汪汪"); } @Override public Dog getAnimal() { // 返回类型可以是子类(协变返回类型) return new Dog(); } }
2

内存分配示意图

栈内存

dogRef → [堆地址0x1000]

堆内存 - Dog对象

Animal部分:
- name = "旺财"
- age = 3
Dog特有部分:
- breed = "金毛"

第四部分:综合实例演练

通过完整的银行系统案例,综合运用继承和super关键字

1

创建基类:银行账户

public class BankAccount { protected String accountNumber; protected double balance; protected String ownerName; public BankAccount(String accountNumber, String ownerName, double initialBalance) { this.accountNumber = accountNumber; this.ownerName = ownerName; this.balance = initialBalance; } public void deposit(double amount) { if (amount > 0) { balance += amount; System.out.println("存入:¥" + amount); } } public void displayInfo() { System.out.println("账户:" + accountNumber + " 余额:" + balance); } }
2

创建储蓄账户子类

public class SavingsAccount extends BankAccount { private double interestRate; public SavingsAccount(String accountNumber, String ownerName, double initialBalance, double interestRate) { super(accountNumber, ownerName, initialBalance); // 调用父类构造 this.interestRate = interestRate; } public void addInterest() { double interest = balance * interestRate / 100; super.deposit(interest); // 调用父类方法 } @Override public void displayInfo() { super.displayInfo(); // 调用父类方法 System.out.println("利率:" + interestRate + "%"); } }
3

测试继承功能

public class BankTest { public static void main(String[] args) { // 创建储蓄账户 SavingsAccount myAccount = new SavingsAccount("622202123456", "张三", 10000.0, 2.5); // 调用继承的方法 myAccount.deposit(5000.0); myAccount.addInterest(); // 调用重写的方法 myAccount.displayInfo(); } }

第五部分:常见错误与最佳实践

总结继承使用中的常见错误及最佳实践建议

常见错误1:super()位置错误

错误代码:
public class Child extends Parent { public Child() { System.out.println("初始化"); super(); // 编译错误!必须在第一行 } }
正确写法:
public Child() { super(); // 必须是第一条语句 System.out.println("初始化"); }

常见错误2:方法重写错误

错误:访问权限更严格
// 父类 public void show() {} // 子类 - 错误!不能降低访问权限 private void show() {} // 编译错误

最佳实践

  • 使用 @Override 注解确保正确重写
  • 避免过深的继承层次(不超过3层)
  • 优先使用组合而非继承
  • 父类设计应该稳定,避免频繁修改
  • protected成员需谨慎使用

知识总结

继承核心要点

  • 使用extends关键字
  • 单继承机制
  • 继承非private成员
  • 构造方法不继承

super关键字用法

  • super.属性 - 访问父类属性
  • super.方法() - 调用父类方法
  • super() - 调用父类构造

方法重写规则

  • 方法签名必须相同
  • 访问权限不能更严格
  • 返回类型可以是子类(协变)
  • 异常范围不能扩大

动手练习

  1. 创建一个Shape类(包含color属性、draw方法)
  2. 创建Circle类继承Shape,添加radius属性
  3. 使用super调用父类构造方法
  4. 重写draw方法,先调用父类draw再添加圆形绘制
  5. 创建测试类验证继承功能