面向对象 OOP

92 阅读3分钟

Java 语言应用的编程范式中比较重要的一个是 OOP,例如,类可以实现很多接口,类只能继承一个类。

1.封装

封装是保障安全的重要方式,Java 中定义了修饰符 public, private, protected 是为了区分属性的可见范围,这是对面向对象封装特性的应用。
封装将数据保存在抽象数据结构的内部,明确定义外部可见的属性,通过这种方式来屏蔽实现的细节,既提供了数据安全的保障,又对使用方屏蔽了细节,使得协作开发双方的耦合程度大大降低,程序的可扩展性增强。

public class Person {
   public String name;
   private int age;

   public String getName(){
      return name;
   }

   public boolean isRetire() {
        return age <= 60;
    } 
}

上面的例子定义了人的两个属性,名字和年龄。名字是公开的可获取,但是不可修改。年龄也被 private 封装到了类和实例中,对外提供查询是否退休,但不提供真实年龄。

2.继承

继承定义了对象之间的关系,在 Java 中只能有一个父类,通过这样的方式能够在父类修改的时候同时扩展应用到所有子类。

public class Employee extends Person {
    private String bossName;
    private String department;
}

public class Manager extends Person {
    private String team;
}

雇员的类 Employee 继承自 Person,自动获取了 getNameisRetire 的方法,此时如果 Person 新定义 public 属性性别 sex,则子类 EmployeeBoss 都可以直接获得。

3.多态

多态用来扩展父类的方法和属性。

  • 在编译时 多态 体现为方法的重载
public class Student extends Person {
    public getClass(String name) {
        ...
    }
    
    public getClass(int number) {
        ...
    }
}

上面的 Student 定义了两个获得班级的方式,一个是根据名字,一个是根据学号。因为两个同名方法的变量类型不同,能够实现在编译时的多态。

  • 在运行时 多态 体现为方法的重写,子类可以覆盖父类的实现
public class Processor extends Person {
    private boolean isTenure;

    public boolean isRetire() {
        return isTenure || age <= 60;
    } 
}

上面的 Processor 定义了私有属性是否获得终身教职,重载了父类 Person 的退休方法,增加了终身教职的逻辑判断。

4.类关系

  • 泛化关系 Generalization
classDiagram
Animal <|-- Duck
Animal <|-- Fish
Animal <|-- Zebra

用来描述继承,这里 Duck, Fish, Zebra 都是 Animal

  • 实现关系 Realization
classDiagram
Move <|.. Swim
Move <|.. Run
Move <|.. Jump

用来描述对接口的视线, 这里的 Swim, Run, Jump 都实现了 Move

  • 聚合关系 Aggregation
classDiagram
House o-- Restroom
House o-- Living room
House o-- Bedroom

用来表述整体是由部分聚合的,部分可以脱离整体存在,这里的 Restroom, Living room, Bedroom 都是 House 的一部分,且可以单独存在

  • 组合关系 Composition
classDiagram
Body *-- Head
Body *-- Hand
Body *-- Foot

用来表述整体由部分组成的,部分不能脱离整体存在,这里的 Head, Hand, Foot 都是 Body 的一部分,不能单独存在

  • 关联关系 Association
classDiagram
University "1" -- "n" Major

用来表示对象之间的联系,这里的 University 有多个 Major

  • 依赖关系 Dependency
classDiagram
Plant ..> Sunshine

用来表示对象之间的强关联,这里的 Plant 依赖于 Sunshine 而存在