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,自动获取了 getName 和 isRetire 的方法,此时如果 Person 新定义 public 属性性别 sex,则子类 Employee 和 Boss
都可以直接获得。
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 而存在