面向对象基础

1. 面向对象和面向过程

1.1 定义

  • 面向过程编程(POP):面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
  • 面向对象编程(OOP):面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。

1.2 面向对象优点

  • 易维护:由于良好的结构和封装性,OOP 程序通常更容易维护。
  • 易复用:通过继承和多态,OOP 设计使得代码更具复用性,方便扩展功能。
  • 易扩展:模块化设计使得系统扩展变得更加容易和灵活。

2. 面向对象三大特征

2.1 封装

将对象的属性隐藏在对象内部,不允许外部对象直接访问对象内部的信息,但可以通过这个对象提供的方法操作属性。

2.2 继承

继承是在已存在的类的定义作为基础创建新类,新类可以增加新的数据和功能,也可以使用父类功能。

注意:

  • 子类拥有父类所有属性和方法(包括私有属性和方法),但是不能访问父类的私有属性和方法。

2.3 多态

多态,顾名思义,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。

多态特点:

  • 对象类型和引用类型之间具有继承(类)/实现(接口)的关系
  • 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定
  • 多态不能调用“只在子类存在但在父类不存在”的方法
  • 如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法

3. 接口和抽象类

3.1 共同点

  • 实例化:接口和抽象类都不能直接实例化,只能被实现或继承后才能创建具体的对象。
  • 抽象方法:接口和抽象类都可以包含抽象方法。抽象方法没有方法体,必须在子类或实现类中实现。

3.2 不同点

  • 设计目的:接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
  • 继承和实现:类只能单继承,接口可以多继承。同时一个类可以实现多个接口。
  • 成员变量:接口中的成员变量只能是public static final类型,不能被修改且必须有初始值。抽象类就没有这个限制。
  • 方法:JAVA8之前,接口的方法只能是方法声明。JAVA8起,可以在接口中定义default方法和static方法。JAVA9起,接口可以包含private方法。

4. 深拷贝,浅拷贝,引用拷贝

4.1 定义

  • 深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
  • 浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
  • 引用拷贝:新开一个引用指向需要拷贝的对象。

拷贝实现可以实现Cloneable接口中的clone方法。

4.2 比较