什么是面向对象?
对比面向过程,是两种不同处理问题的角度,
面向过程更注重事情的每一个步骤以及顺序,面向对象更注重事情有哪些参与者(对象),以及各自需要做什么
比如:洗衣机洗衣服
面向过程:
会将任务拆解成一系列的步骤:
1、打开洗衣机
2、放衣服
3、放洗衣液
4、清洗
5、烘干
面向对象:
会拆出人和洗衣机两个对象;
以上例子就能看出,面向过程比较直接高效,而面向对象更易于复用,扩展和维护
面向对象的三大特征:封装、继承、多态
封装:
1、概念:封装就是隐藏内部实现即对象的属性和实现细节,仅对外公开接口。
2、封装实现的步骤:
1、将属性私有化(设置为private)
2、提供一个public的set方法,对属性进行设置(public修饰)
3、提供一个public的get方法,用于获取属性(public修饰;注意!boolean变量的get方法是is开头。)
4、只用于本类的辅助性方法,使用private修饰,希望其他类调用的方法用public修饰。
3、封装的目的:
增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以 特定的访问权限来使用类的成员
继承:
继承是面向对象的基本特征之一,继承就是子类继承父类的特征和行为,使得子类对象具有父类的所有属性和方法(private修饰的属性不能拥有),同时子类还可以拥有自己的专有“内容”。java中的继承是单继承,即一个类只有一个父类,子类知道父类是谁,而父类是不知道下面有几个子类的。
继承主要解决的问题就是:共性抽取;父类更通用,子类更具体,解决代码重用,去掉代码冗余,为了多态服务,继承是多态的前提,如果没有继承,就没有多态。
父类也可以叫基类、超类, 子类也可以叫派生类,一般我们用父子类来称呼。在继承的关系中就是is-a。
在父子类继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:
1、直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有就往上找
2、间接通过成员方法访问成员变量,该方法属于谁,就优先用谁,没有往上找
this、super,final关键字:
1、this关键字代表当前对象
2、super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
3、 final 表示最终的意思,可以修饰类、成员变量、成员方法
修饰类:类不可以被继承
修饰成员变量:变量为常量,值不可以改变
修饰成员方法:方法不能被重写
final还可以修饰局部变量:①修饰基本数据类型,值不能改变;②修饰引用数据类型,地址值不能改变
多态:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
多态存在的三个必要条件(extends继承或者implements实现,是多态性的前提)
- 继承
- 重写
- 父类引用指向子类对象 Parent p = new Child();
面向对象五大基本原则
单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
替换原则(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
依赖原则(the Dependency Inversion Principle DIP)
高层模块不应该依赖于底层模块,两者应该依赖于其抽象。
抽象不应该依赖具体实现,具体实现应该依赖抽象。
上面2点是依赖倒置原则的概念,也是核心。主要是说模块之间不要依赖具体实现,依赖接口或抽象。
其实依赖倒置原则的核心思想是面向接口编程。
接口分离原则(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
面向过程
面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。
面向过程始终关注的是怎么一步一步实现的,通过控制代码,从而实现函数的顺序执行
优点:
流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析。
效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。
缺点:
需要深入的思考,耗费精力,代码重用性低,扩展能力差,后期维护难度比较大。