🕛 面向对象

吞佛童子2022年6月9日
  • Java
  • 基础
大约 3 分钟

🕛 面向对象

1. 面向对象 VS 面向过程

类型特性代表语言
面向对象将问题分解为一个个步骤,每个步骤封装成一个类,类中包含 属性 & 方法Java, C++
面向过程将问题分解为一个个步骤,每个步骤用函数实现,依次调用C

2. 面向对象三大特性

1) 封装

将一个事物的属性 & 行为 看成一个整体,封装成一个类,类中包含:

  • 公有属性 & 方法,可以被别的类访问 & 调用

  • 私有属性 & 方法,不可以被外部类访问 & 调用,对外隐藏,从而保护了自身类的数据安全


2) 继承

  • 通过 extends 关键字可以继承其他类的功能
  1. 特点

    • 子类可以拥有父类所有属性 & 方法,但父类中的 私有属性 & 方法 子类无法访问,只能拥有

    • 子类可以有自己的属性 & 方法

    • 子类可以重写(@Override)父类的方法

  2. 继承 VS 实现

类型继承实现
关键字extendsimplements
作用对象单继承多实现
特性多个类某部分功能相同,在某种程度上属于同一类,则可以将公共部分放到父类中多个类处理目标相同,但各自处理方法不同,则可以将方法定义成接口中的方法,形成一种标准
  1. 抽象类 VS 接口
类型抽象类接口
关键字extendsimplements
作用对象单继承多实现
成员变量默认 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 必须相同;引用类型 相同 或 更小
抛出的异常无约束相同 或 更小
访问修饰符无约束相同 或 更大
发生阶段编译器运行期
上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou