1. 继承的基本概念与实现机制
1.1 继承的定义与语法特征
Java 继承是面向对象设计中的核心机制之一,通过 extends 关键字,子类获得父类的字段和方法的复用能力。它让代码呈现出清晰的层次结构,便于对共有行为进行统一维护,同时让子类在需要时扩展或重写父类行为,提升系统的可维护性与可扩展性。
在实际设计中,继承体现了“行为复用+类型层次”的关系,使得同一组接口可以在不同实现中共享共性逻辑。需要注意的是,Java 的单继承模型意味着一个类只能有一个直接父类,但可以通过实现多个接口来获得额外的行为能力,从而在需要时通过组合来避免过深的继承结构。
1.2 访问控制与构造顺序
子类在初始化时会先执行父类的构造函数,这体现了 父类初始化先于子类初始化 的原则。通过 super() 调用可以显式地控制父类构造器的执行,确保父类字段在子类使用前已正确就位。这对于避免空指针和未初始化状态非常关键。
继承带来的设计影响还体现在字段访问权限上:protected 成员对子类可见,而 private 成员则只能通过公有或受保护的访问器访问。理解这一点有助于设计稳定的 API,避免过度暴露内部实现。
class Animal {protected String name;public Animal(String name) {this.name = name;System.out.println("Animal 构造: " + name);}public void speak() { System.out.println("动物发声"); }
}class Dog extends Animal {private String breed;public Dog(String name, String breed) {super(name);this.breed = breed;System.out.println("Dog 构造: " + breed);}@Overridepublic void speak() { System.out.println(name + " 说汪汪"); }
}
2. 多态的核心原理与实现方式
2.1 动态绑定、方法覆盖与多态性
多态的核心在于 方法的动态绑定,运行时根据实际对象的类型来决定调用哪一个实现。这种机制使得同一段代码可以处理不同子类的对象,从而实现更高的灵活性与扩展性。
通过方法覆盖(override)父类的方法,子类提供了专门的实现;而通过向上转型,调用方无需了解具体子类即可完成行为调用,从而实现接口契约的统一性与可替换性。
class Cat extends Animal {public Cat(String name) { super(name); }@Overridepublic void speak() { System.out.println(name + " 喵喵"); }
}public class PolymorphismDemo {public static void main(String[] args) {Animal a = new Dog("Rex","Labrador");Animal b = new Cat("Mimi");a.speak(); // 调用 Dog 的 speak()b.speak(); // 调用 Cat 的 speak()}
}
2.2 接口、抽象类与多态的关系
接口和抽象类是实现多态的两种关键载体。接口定义能力契约,让实现者承诺提供某些行为;抽象类提供部分实现,子类在此基础上完成具体逻辑。两者结合可以实现高内聚、低耦合的设计。
在实际设计中,应关注:谁来承担契约责任、是否需要字段和默认实现、以及是否需要多继承能力。正确的选择会显著提升后续扩展的灵活性与可维护性。
interface Movable {void move();
}
abstract class Vehicle implements Movable {protected String name;public Vehicle(String name) { this.name = name; }public abstract void move();
}
class Car extends Vehicle {public Car(String name) { super(name); }@Overridepublic void move() { System.out.println(name + " 汽车行驶"); }
}
class Bike implements Movable {private String name;public Bike(String name) { this.name = name; }@Overridepublic void move() { System.out.println(name + " 自行车骑行"); }
}
3. 继承与多态在系统扩展性中的应用
3.1 开闭原则与依赖倒置原则在设计中的应用
面向对象设计要实现良好的系统扩展性,应该遵循 开闭原则,即对扩展开放、对修改关闭;以及 依赖倒置原则(DIP),让高层模块依赖抽象而非具体实现。通过将行为抽象为接口或抽象类,并使用多态机制调用实现,可以在不修改现有代码的情况下扩展新功能。

实现要点包括:将变更点封装在独立的子类或实现中、通过工厂模式或注入容器解耦创建过程、以及尽量降低对具体实现的依赖。这些做法共同提升了系统的可测试性与可维护性。
3.2 策略模式、工厂模式与多态的结合
策略模式把可变行为封装成独立对象,通过多态在运行时替换策略实现,从而实现行为算法的可扩展性。这是提升系统扩展性的典型做法之一。
interface CompressionStrategy {void compress(String data);
}
class ZipCompression implements CompressionStrategy {@Overridepublic void compress(String data) { System.out.println("ZIP 压缩: " + data); }
}
class RarCompression implements CompressionStrategy {@Overridepublic void compress(String data) { System.out.println("RAR 压缩: " + data); }
}
class Compressor {private CompressionStrategy strategy;public void setStrategy(CompressionStrategy strategy) { this.strategy = strategy; }public void compress(String data) { if (strategy != null) strategy.compress(data); }
}
4. 代码示例与要点
4.1 基础示例:使用父类与子类实现多态调用
通过一个简单的示例,演示如何使用父类引用指向不同子类对象,并调用同名方法实现多态行为。这种设计有助于把变化的行为点提取到独立子类中,从而提升系统的可扩展性。
abstract class Shape {protected String color;public Shape(String color) { this.color = color; }public abstract void draw();
}
class Circle extends Shape {public Circle(String color) { super(color); }@Overridepublic void draw() { System.out.println("画一个 " + color + " 圆"); }
}
class Square extends Shape {public Square(String color) { super(color); }@Overridepublic void draw() { System.out.println("画一个 " + color + " 方形"); }
}
public class PolymorphicShapes {public static void main(String[] args) {Shape s1 = new Circle("红色");Shape s2 = new Square("蓝色");s1.draw();s2.draw();}
}
4.2 抽象类与接口的实战选择
在实际项目中,抽象类 vs 接口 的选择需要结合实际场景。如果需要提供默认实现、共享字段状态,使用 抽象类 更合适;但如果只需要契约、并希望实现高度解耦,接口 是更好的选择。利用 Java 8+ 的默认方法也能在一定程度上兼顾代码复用与契约。
interface Drawable {void render();
}
abstract class BaseRenderer implements Drawable {protected String theme;public BaseRenderer(String theme) { this.theme = theme; }public void render() { // 提供默认实现System.out.println("渲染主题: " + theme);}
}
class PNGRenderer extends BaseRenderer {public PNGRenderer(String theme) { super(theme); }@Overridepublic void render() { System.out.println("PNG 渲染: 主题 " + theme); }
}
class SVGRenderer implements Drawable {public void render() { System.out.println("SVG 渲染"); }
}


