方以类聚 物以群分

定义

类是一组相似事物的统称

为什么是一组

单个事物无法抽象成类。

为什么是相似

由类具体到对应的对象各不相同。

为什么是统称

能概括多个事物。

如何划分类

  1. 有相似点的就是类
  2. 角度决定看法,根据不同的业务场景做出不同处理。

“我”和”猪”是一类吗?答案是的,因为都是”哺乳动物”。

“我”和”树”是一类吗?答案是的,因为都是”生物”。

面向对象的类

类是属性和方法的集合

属性

属性属于对象所具有的特征,大部分都是”名词”。属性设计应该符合”不可再分原则”。

方法

方法属于对象所具有的行为,大部分都是”动词”。方法设计应该符合”单一原则”。

对象

对象属于具体的类。

  • 现实中的对象:能够看到的事物
  • 现实中的类:由对象归纳总结出类
  • 软件中的对象:软件运行过程中存在的对象
  • 软件中的类:软件设计过程中抽象出的类

由现实中的对象归纳出现实中的类,由现实中的类抽象模拟成软件类实例化成对象与程序进行交互。

接口

什么是接口

一组具有相关交互功能点的集合

相关

功能是相关的。

交互

用于物体之间的交互。

功能

只涉及定义,不涉及实现。

集合

多个功能,而不是一个功能。

为什么要使用接口

有时候并不知道具体对象的类,只知道具体的功能。

抽象类

抽象类只能用于继承,不能用于实例化。

为什么需要抽象类

某些场景不够用。

为什么需要设计一种只能用于继承,不能用于实例化的类

  1. 普通类基于对象进行抽象,抽象类是基于类抽象出来的
  2. 抽象类具有抽象方法,子类必须实现抽象方法

抽象类和接口的区别

抽象类本质上还是类,强调一组事物的相似性,包括属性和方法的相似性。

接口只强调方法的相似性,并且只仅仅体现在方法定义上的相似性,而没有实现上的相似性。

为什么有了接口,还需要抽象类?

抽象类看起来是一个介于接口和类之间的概念,同时具备接口和类的部分特征。

抽象

  1. 抽取比较像的部分
  2. 抽取多个对象或者类比较像的部分

抽象的层次

  1. 将对象抽象成类

    1. 属性相识的对象抽象成类
    2. 属性类别一致而不是属性值一致
  2. 由类抽象成超类/父类

    1. 行为相似抽取成父类

抽象的层次是不限的,根据业务的需要或者观察的角度,可以抽取出很多层。

为什么需要抽象/抽象的作用?

  1. 隔离关注点,降低复杂度

核心特征

封装

我们要封装什么?
  • 你的身家
  • 漂亮MM的年龄
  • 如何消磨时间
  • ……

封装就是类的一个功能,我们可以封装类的属性(”你的身家”),也可以封装类的方法(”如何打磨时间”)

为什么要封装
  1. 数据保护。
  2. 通过封装,不会暴露内部属性,对属性的操作也是统一的。
  3. 隔离复杂度,每个类只需要关注自己负责的功能如何完成即可,如果需要其他类配合,只需要调用其他类的方法,而不需要了解其他类的具体实现。

需要get/set吗?

应对需求…

  • 老实人说真实年龄
  • 漂亮MM说-10岁
  • 明星说永远25岁
  • 隐私保护着说不告诉你
  1. public interface IPerson {
  2. int getAge();
  3. }
  4. public class HonestMan implements IPerson {
  5. private int age;
  6. public HonestMan(int age) {
  7. this.age = age;
  8. }
  9. @Override
  10. public int getAge() {
  11. return age;
  12. }
  13. }
  14. public class BeautyMM implements IPerson {
  15. private int age;
  16. public BeautyMM(int age) {
  17. this.age = age;
  18. }
  19. @Override
  20. public int getAge() {
  21. int myAge = this.age - 10;
  22. if (myAge < 18) {
  23. myAge = 18;
  24. }
  25. return myAge;
  26. }
  27. }
  28. public class Star implements IPerson {
  29. private int age;
  30. private final int FIX_AGE = 25;
  31. public Star(int age) {
  32. this.age = age;
  33. }
  34. @Override
  35. public int getAge() {
  36. return FIX_AGE;
  37. }
  38. }
  39. public class PrivacyProtector implements IPerson {
  40. private int age;
  41. public PrivacyProtector(int age) {
  42. this.age = age;
  43. }
  44. @Override
  45. public int getAge() {
  46. return -1;
  47. }
  48. }

继承

  1. 子类继承父类的属性和行为,但同时也会改变父类的行为。
  2. 先有抽象后有继承,通过继承表达抽象的关系。

多态

  1. 面向对象的多态:使用父类指针或引用,能够调用子类对象
  2. 多态屏蔽了对象的差异性,使得开发能够写出通用性的代码
  3. 当增加新的子类的时候,调用者无需改动就能适应新的子类
  1. public abstract class Animal{
  2. String talk();
  3. }
  4. public class Cat extends Animal{
  5. @Override
  6. public String talk(){
  7. return "miao miao maio....";
  8. }
  9. }
  10. public class Dog extends Animal{
  11. @Override
  12. public String talk(){
  13. return "wang wang wang......";
  14. }
  15. }
  16. public class Application{
  17. public static void talk(Animal animal){
  18. System.out.println(animal.talk());
  19. }
  20. public static void main(String[] args){
  21. Animal dog = new Dog();
  22. talk(dog);
  23. }
  24. }