Java基础: Java 中的代码复用

本页内容

Java 中的代码复用

Java 引人注目的一项特性是代码的重复使用或者再生。

达到这一目标有两种方式。

  1. 合成 (Composition)

合成是指一个类包含另一个类的实例作为其成员变量,通过调用成员对象的方法来实现复用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Engine {
    void start() {
        System.out.println("Engine started");
    }
}

class Car {
    private Engine engine;  // 合成
    
    Car(Engine engine) {
        this.engine = engine;
    }
    
    void start() {
        engine.start();
        System.out.println("Car started");
    }
}

因为新类由现有类的对象合并而成。我们只是简单地重复利用代码的功能,而不是采用它的形式。

组合的特点:

  • 通过成员变量实现
  • 一个类"拥有"另一个类的对象
  • 体现"包含"或"由…组成"的关系
  • 比继承更灵活
  1. 继承 (Inheritance)

建一个新类,将其作为现有类的一个“类型”。

我们可以原样采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。

Java 通过关键字 extends 在语言级别支持类的复用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Dog is barking");
    }
    
    @Override
    void eat() {
        System.out.println("Dog is eating");
    }
}

Dog (狗) 是一种动物,它很自然的继承了动物 (Animal) 的接口,并且具有自己的特性 (吼叫)。

继承的特点:

  • 子类继承父类的非私有成员 (属性和方法)
  • 子类可以重写(override)父类的方法
  • 子类可以添加新的属性和方法
  • 体现"is-a"关系(子类是父类的一种)

扩展

在面向对象编程中,“is-a"和"has-a"是两种基本的类关系模型,它们决定了类之间应该如何组织和关联。

“is-a"关系(继承关系)

​ “is-a"关系表示继承关系,即一个类是另一个类的特殊化版本。

“has-a"关系(组合关系)

​ “has-a"关系表示组合关系,即一个类包含另一个类的实例作为其组成部分。

使用组合还是继承?

“组合优于继承”(Favor composition over inheritance) 是面向对象设计的一个重要原则,因为它提供了更好的封装性和更灵活的代码结构。

设计建议:

  1. 优先使用组合:Java设计原则建议"组合优于继承”,因为组合更灵活,耦合度更低
  2. 谨慎使用继承:只有当确实存在"is-a"关系时才使用继承
  3. 避免深度继承:继承层次不宜过深,通常不超过3层
  4. 考虑接口:有时使用接口比继承更合适,特别是需要多重"is-a"关系时