🕛 面向对象
2022年6月9日
- Java
🕛 面向对象
1. 面向对象 VS 面向过程
类型 | 特性 | 代表语言 |
---|---|---|
面向对象 | 将问题分解为一个个步骤,每个步骤封装成一个类,类中包含 属性 & 方法 | Java, C++ |
面向过程 | 将问题分解为一个个步骤,每个步骤用函数实现,依次调用 | C |
2. 面向对象三大特性
1) 封装
将一个事物的属性 & 行为 看成一个整体,封装成一个类,类中包含:
公有属性 & 方法,可以被别的类访问 & 调用
私有属性 & 方法,不可以被外部类访问 & 调用,对外隐藏,从而保护了自身类的数据安全
2) 继承
- 通过
extends
关键字可以继承其他类的功能
特点:
子类可以拥有父类所有属性 & 方法,但父类中的 私有属性 & 方法 子类无法访问,只能拥有
子类可以有自己的属性 & 方法
子类可以重写(
@Override
)父类的方法
继承 VS 实现
类型 | 继承 | 实现 |
---|---|---|
关键字 | extends | implements |
作用对象 | 单继承 | 多实现 |
特性 | 多个类某部分功能相同,在某种程度上属于同一类,则可以将公共部分放到父类中 | 多个类处理目标相同,但各自处理方法不同,则可以将方法定义成接口中的方法,形成一种标准 |
- 抽象类 VS 接口
类型 | 抽象类 | 接口 |
---|---|---|
关键字 | extends | implements |
作用对象 | 单继承 | 多实现 |
成员变量 | 默认 default ,可在子类中重新定义 | public static final |
可否实例化 | 否 | 否 |
是否含有抽象方法 | 可以含有,也可以没有 | 默认都是 public abstract ,除了 default 方法有具体实现 |
默认实现方法 | ✔ | ✔ (Java 8 中接口用 default 定义默认方法) |
- 接口成员变量为什么是 static final?
static
- 为了实现类的 static 方法能够调用 本接口的 成员变量,最大限度利用接口的成员变量
final
- 防止实现类修改 成员变量,若能够随意修改,则违反了接口设计初衷
3) 多态
一个类存在多种状态,到底执行哪种状态的方法,在运行期间才能确定
出现场景:
- 有类继承 / 接口实现
- 子类重写父类方法
- 父类在等号左边,右边为重写了父类方法的子类
3. 面向对象 5 大基本原则
- 单一职责 : 降耦合
- 开放封闭 : 对外扩展开放,对内修改封闭
- 里氏替换 : 子类能够替换其基类,但基类不一定能够替换子类
- 依赖倒置 : 高层模块不依赖于底层模块,两者之间隔着一个抽象层
- 接口隔离 : 使用多个小的专用接口,而非大的总接口
4. 重载 VS 重写
- 子类可以 重写 父类的 static 方法,不会报错;但是 static 方法在编译期已经确定,所以如果采用动态链接时,仍然调用的是 父类的 static 方法
- 因此,原则上不允许重写 父类 static 方法
- 只有 子类.static 方法可以调用子类 static 方法
class SuperClass { // 父类
public static void staticMethod() {
System.out.println("SuperClass: inside staticMethod");
}
class ChildClass extends SuperClass{ // 子类
public static void staticMethod(){
System.out.println("ChildClass: inside staticMethod");
}
}
public static void main(String []args){
SuperClass superClassWithSuperCons = new SuperClass();
SuperClass childClassWithSubCons = new ChildClass();
ChildClass childClassWithChildCons = new ChildClass();
superClassWithSuperCons.staticMethod();
childClassWithSubCons.staticMethod();
childClassWithChildCons.staticMethod();
}
}
}
SuperClass: inside staticMethod - 父 static
SuperClass: inside staticMethod - 父 static
ChildClass: inside staticMethod - 子 static
重载 | 重写 | |
---|---|---|
发生范围 | 同一个类 | 父类 & 子类 |
参数列表 | 必须不同 | 完全相同 |
返回类型 | 无约束 | 基本数据类型 或 Void 必须相同;引用类型 相同 或 更小 |
抛出的异常 | 无约束 | 相同 或 更小 |
访问修饰符 | 无约束 | 相同 或 更大 |
发生阶段 | 编译器 | 运行期 |