面向对象编程和面向过程编程
面向对象编程
面向对象编程是一种编程范式,它将现实世界中的事物抽象为对象,把类或对象作为基本单元来组织代码,对象具有属性(称为字段或属性)和行为(称为方法)。面向对象编程的设计思想是以对象为中心,通过对象之间的交互来完成程序的功能,具有灵活性和可扩展性,通过封装和继承可以更好地应对需求变化。
面向过程编程
面向过程编程是一种以过程或函数为中心的编程范式,以过程作为基本单元来组织代码。过程其实就是动作,对应到代码中来就是函数,面向过程中函数和数据是分离的,数据就是成员变量。
主要区别
数据与行为的关系:
- 面向对象:数据和行为封装在对象内部,数据操作由对象方法进行管理。
- 面向过程:数据和函数是分离的,函数对数据进行操作。
可扩展性和复用性:
- 面向对象:通过继承、接口、多态等机制支持代码的高复用性和扩展性。
- 面向过程:复用性较低,扩展需要修改已有代码,影响整体稳定性。
面向对象的特性和设计原则
三大特性
- 封装:将数据和行为封装在对象内部,提供接口进行访问,隐藏实现细节,提高安全性。
- 继承:子类可以继承父类的属性和方法,实现代码复用和扩展。
- 多态:对象可以通过父类或接口进行多态性调用,不同对象在运行时执行不同的行为。
六大设计原则
- 单一职责原则(SRP):一个类应该只有一个引起它变化的原因,即一个类应该只负责一项职责。例子:考虑一个员工类,它应该只负责管理员工信息,而不应负责其他无关工作。
- 开放封闭原则(OCP):软件实体应该对扩展开放,对修改封闭。例子:通过制定接口来实现这一原则,比如定义一个图形类,然后让不同类型的图形继承这个类,而不需要修改图形类本身。
- 里氏替换原则(LSP):子类对象应该能够替换掉所有父类对象。例子:一个正方形是一个矩形,但如果修改一个矩形的高度和宽度时,正方形的行为应该如何改变就是一个违反里氏替换原则的例子。
- 接口隔离原则(ISP):客户端不应该依赖那些它不需要的接口,即接口应该小而专。例子:通过接口抽象层来实现底层和高层模块之间的解耦,比如使用依赖注入。
- 依赖倒置原则(DIP):高层模块不应该依赖低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。例子:如果一个公司类包含部门类,应该考虑使用合成/聚合关系,而不是将公司类继承自部门类。
- 最少知识原则 (Law of Demeter):一个对象应当对其他对象有最少的了解,只与其直接的朋友交互。
类的组成结构
- 变量(属性)
- 静态变量:归属于整个类
- 实例变量:归属于一个对象
- 方法(行为)
- 静态方法:归属于整个类
- 实例方法:归属于一个对象
实现细节
- 打印对象名可以输出该对象的内存地址
- 成员变量具有默认值
- 一个源文件中可以定义多个类但是只能出现一个主类(被
public
修饰)且该类与源文件的文件名相同
内存原理
对象在内存中的创建过程
- 加载
.class
文件 - 在栈区声明局部变量(对象的引用)
- 在堆区中开辟内存空间并产生对象的地址值
- 默认初始化(对成员变量赋默认值)
- 显式初始化(对常量进行初始化)
- 构造方法初始化
单个对象的内存情况
栈区
-
主方法
main
-
对象的引用
堆区
- 对象的变量
- 成员方法的地址
项目开发中类的种类
Bean类
使用场景
用于描述事物的类
特点
- 至少两个构造方法,一个无参构造方法,一个有参构造方法
- 成员变量为
private
- 为所有成员变量提供
getter
和setter
工具类(Utils)
使用场景
将常用的方法封装成工具类
特点
- 构造方法是
private
的 - 方法都是静态方法(
static
)
测试类
使用场景
用于检查代码的正确性
特点
- 带有
main
方法