第一部分:继承基础概念
继承是面向对象编程的三大特性之一,允许子类继承父类的属性和方法
学习目标
理解继承的概念,掌握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() - 调用父类构造
方法重写规则
- 方法签名必须相同
- 访问权限不能更严格
- 返回类型可以是子类(协变)
- 异常范围不能扩大
动手练习
- 创建一个Shape类(包含color属性、draw方法)
- 创建Circle类继承Shape,添加radius属性
- 使用super调用父类构造方法
- 重写draw方法,先调用父类draw再添加圆形绘制
- 创建测试类验证继承功能