继承、多态与接口:让代码可扩展

W3 你学会了造类。W4 要解决的是:需求一变,代码会不会碎成渣?答案往往藏在 继承、多态、接口 里。

继承:is-a 关系

public class Person {
    protected String name;
    public Person(String name) { this.name = name; }
    public void introduce() {
        System.out.println("我是" + name);
    }
}

public class Student extends Person {
    private String studentId;
    public Student(String name, String studentId) {
        super(name);
        this.studentId = studentId;
    }
    @Override
    public void introduce() {
        System.out.println("我是学生" + name + ",学号" + studentId);
    }
}
  • extends:学生 是一种
  • super:调用父类构造
  • @Override:重写父类方法

能用组合(has-a)就别滥用继承。继承适合稳定的 is-a。

多态:同一个调用,不同表现

Person p = new Student("小杨", "2026001");
p.introduce(); // 实际执行的是 Student 的 introduce

父类引用指向子类对象。调用方法时,看 对象真实类型。这就是多态。

好处:管理器可以只依赖 Person,以后加 Teacher 不用改管理器主流程。

抽象类 vs 接口

抽象类:有共性实现,又希望子类必须实现某些方法。

public abstract class Shape {
    public abstract double area();
    public void printArea() {
        System.out.println(area());
    }
}

接口:定义能力契约,「能做什么」,不关心你是谁。

public interface Persistable {
    void save();
}

public class Student implements Persistable {
    @Override
    public void save() {
        System.out.println("保存学生...");
    }
}

现代 Java 开发里,面向接口 出现频率极高(Spring 几乎建立在这上面)。

重构任务:给学生管理系统加接口

public interface StudentRepository {
    void add(Student s);
    void list();
}

public class MemoryStudentRepository implements StudentRepository {
    // 把原来 StudentManager 的数组逻辑搬进来
}

main 只依赖 StudentRepository,不依赖具体实现。以后换成数据库实现,调用方几乎不用改。

本周练习清单

一句话记住

  • 继承:复用与扩展 is-a
  • 多态:同一指令,不同角色不同演技
  • 接口:约定能力,分离实现

写在最后

语言基础的「对象篇」到这里告一段落。下周进入 集合框架——用 ArrayList 替换手写数组,生产力会立刻上升一截。


YoungGc · Eden手记
学习是第一生产力。

posted @ 2026-07-28 09:55  Eden手记  阅读(4)  评论(0)    收藏  举报