理解面向对象编程及面向对象编程语言 的关键就是理解其四大特性:封装、抽象、继承、多态
我们还要知道每个特性存在的意义和目的
我要强调一下,对于这四大特性,尽管大部分面向对象编程语言都提供了相应的语法机 制来支持,但不同的编程语言实现这四大特性的语法机制可能会有所不同。所以,今天,我 们在讲解四大特性的时候,并不与具体某种编程语言的特定语法相挂钩

1、 封装(Encapsulation)

封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据 .

  1. package encapsulation;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.math.BigDecimal;
  6. /**
  7. * @program: ObjectPractise
  8. * @description: 封装定义demo钱包类
  9. * @author: DP_Li
  10. * @create: 2021/11/08
  11. */
  12. @Data
  13. @AllArgsConstructor
  14. public class Wallet {
  15. private String id;
  16. private long createTime;
  17. private BigDecimal balance;
  18. private long balanceLastModifiedTime;
  19. public Wallet() {
  20. this.id = "1";
  21. this.createTime = createTime;
  22. this.balance = balance;
  23. this.balanceLastModifiedTime = balanceLastModifiedTime;
  24. }
  25. public void increaseBalance(BigDecimal increasedAmount) throws Exception {
  26. if (increasedAmount.compareTo(BigDecimal.ZERO) < 0) {
  27. throw new Exception("...");
  28. }
  29. this.balance.add(increasedAmount);
  30. this.balanceLastModifiedTime = System.currentTimeMillis();
  31. }
  32. public void decreaseBalance(BigDecimal decreasedAmount) throws Exception {
  33. if (decreasedAmount.compareTo(BigDecimal.ZERO) < 0) {
  34. throw new Exception("...");
  35. }
  36. if (decreasedAmount.compareTo(this.balance) > 0) {
  37. throw new Exception("...");
  38. }
  39. this.balance.subtract(decreasedAmount);
  40. this.balanceLastModifiedTime = System.currentTimeMillis();
  41. }
  42. }

这个语法机制就是 访问权限控制 例子中的 private、public 等关键字就是 Java 语言中的访问权限控制语 法。private 关键字修饰的属性只能类本身访问,可以保护其不被类之外的代码直接访问.

1.1、 封装的意义是什么?

势必影响代码的可读性、可维 护性 为了避免属性可以随意被以各种奇 葩的方式修改,而且修改逻辑可能散落在代码中的各个角落.。

1.2、 它能解决什么编程问题?

类仅仅通过有限的方法暴露必要的操作,也能提高类的易用性 如果一个冰箱有很多按钮,你就要研究很长时间,还不一定能操作正确。相 反,如果只有几个必要的按钮,比如开、停、调节温度,你一眼就能知道该如何来操作,而 且操作出错的概率也会降低很多

2、 抽象(Abstraction)

封装主要讲的是如何隐藏信息、保护数据 而抽 象讲的是如何隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知 道这些功能是如何实现的 在面向对象编程中,我们常借助编程语言提供的接口类(比如 Java 中的 interface 关键字 语法)或者抽象类(比如 Java 中的 abstract 关键字语法)这两种语法机制,来实现抽象 这一特性 。

类的方法是通过编程语言中的“函数”这一语法机制来实现的。 通过函数包裹具体的实现逻辑,这本身就是一种抽象 调用者在使用函数的时候,并不需要 去研究函数内部的实现逻辑,只需要通过函数的命名、注释或者文档,了解其提供了什么功 能,就可以直接使用了。

2.1 抽象的意义是什么?

抽象作为一种只关注功能点不关注实现的设计思路. 人类处理复杂性的有效 手段。在面对复杂系统的时候,人脑能承受的信息复杂程度是有限的,必须忽略掉 一些非关键性的实现细节

2.2它能解决什么编程问题?

我们在定义(或者叫命名)类的方法的时候,也要有抽象思维,不要在 方法定义中,暴露太多的实现细节,以保证在某个时间点需要改变方法的实现逻辑的时候, 不用去修改其定义. 举例:比如我们 而是存储在私有云上,那这个命 名也要随之被修改。相反,如果我们定义一个比较抽象的函数,比如叫作 getPictureUrl(),那即便内部存储方式修改了,我们也不需要修改命名。

3、继承

is-a 关系,比如猫是一种哺乳动物。 。单继承表示一个子类只继承一个父类。

3.1 继承存在的意义是什么

继承最大的一个好处就是代码复用 。 缺点: 继承层次过深过复杂,就会导 致代码可读性、可维护性变差。为了了解一个类的功能,我们不仅需要查看这个类的代码, 还需要按照继承关系一层一层地往上查看“父类、父类的父类……”的代码。还有,子类和 父类高度耦合,修改父类的代码,会直接影响到子类

3.2 继承它能解决什么编程问题 ?

避免代码重复写多遍

4、多态(Polymorphism)

多态是指,子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。

4.1 使用继承、重写实现多态

  1. //1.编程语言要支持父类对象可以引用子类对象
  2. public class SortedDynamicArray extends DynamicArray{
  3. //2.语法机制是编程语言要支持继承
  4. public class SortedDynamicArray extends DynamicArray{
  5. //3.支持子类可以重写(override)父类中的方法
  6. public class SortedDynamicArray extends DynamicArray{
  7. @Override
  8. public void add(Integer e) {
  9. //***********************//
  10. }
  11. // 通过这三种语法机制配合在一起,我们就实现了在 test() 方法中,子类
  12. SortedDyamicArray 替换父类 DynamicArray,执行子类 SortedDyamicArray add()
  13. 方法,也就是实现了多态特性。

4.2 使用接口实现多态

  1. Iterator 是一个接口类,定义了一个可以遍历集合数据的迭代器。Array
  2. LinkedList 都实现了接口类 Iterator。我们通过传递不同类型的实现类(Array
  3. LinkedList)到 print(Iterator iterator) 函数中,支持动态的调用不同的 next()、
  4. hasNext() 实现。
  5. 具体点讲就是,当我们往 print(Iterator iterator) 函数传递 Array 类型的对象的时候,
  6. print(Iterator iterator) 函数就会调用 Array next()、hasNext() 的实现逻辑;当我们往
  7. print(Iterator iterator) 函数传递 LinkedList 类型的对象的时候,print(Iterator iterator)
  8. 函数就会调用 LinkedList next()、hasNext() 的实现逻辑。

4.3 多态特性存在的意义是什么?它能解决什么编程问题?

多态特性能提高代码的可扩展性和复用性 如果我们不使用多态特性,我们就无法将不同的集合类型(Array、LinkedList)传递给相 同的函数(print(Iterator iterator) 函数)

5、理论二:封装、抽象、继承、多态分别可以解决哪些编程问题? - 图1