面向对象
1、面向对象的理解
面向对象(Object Oriented)是一种程序设计的思想。
说面向对象之前,我们先来说说面向过程。来最经典的例子,把大象放进冰箱,1、打开冰箱。2、把大象放进去。3、关上冰箱。嗯,看着很合理,但是需要增加一些新的需求,比如大象放进冰箱以前先转个圈、放进去以后只关一半冰箱门、不放大象了放狮子等等一系列需求时,就需要把代码都捋一遍,再去改逻辑,这样的需求越来越多,那么代码就会越来越乱,难以维护。
于是就诞生了面向对象思想,一切皆对象。我们再用面向对象的思想去看上面的问题,可以拆成两个对象,大象和冰箱,冰箱负责开门关门,大象负责进冰箱,这样以后有新需求或者需求变更,我们只用关心具体的对象。
下面说一下面向对象的三个基本特征是:封装、继承、多态。
2、封装
通过上面的例子我们已经简单的用过封装了,将原本复杂混乱的逻辑,封装成一个个对象。每个对象只做自己的事情。再结合上面的例子,冰箱负责开门,你正常开也行,转个圈开也行,你最后只要把门打开就行;大象负责进冰箱,你跳着进走着进,最后你只要在冰箱里面就行。还有我们经常用的U盘,我们不用管它内部是怎么实现的,只需要用它提供的USB接口就行。
2.1 封装的理解
封装(Encapsulation)指一种实现细节部份包装、隐藏起来的方法。封装是为了防止对实现细节的访问。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
2.2 封装的优点
2.2.1 封装的特点:
- 减少耦合;
- 数据隐藏,数据安全;
- 内部修改保持稳定;
- 提供重用性;
- 分工合作,职责分明;
- 方便构建大型复杂的系统;
3、继承
现实中也会有一些继承,比如继承财产,是儿子从父亲那获得财产。面向对象中的继承,也是子类从父类中获得属性、方法。跟现实中继承不同的是,面向对象中的父类是抽象出来的,不会是一个精确到个体。比如所有的动物都有名字,那我们可以抽象出一个父类Animal,有一个Name属性;猫是动物,所以猫就可以继承Animal来获得Name属性,同时猫还有一个Miao()的方法;这里的猫,其实还是一层抽象,所以还可以继续继承;田园猫是猫,所以它可以继承猫,这时候它就同时获得了Name属性和Miao()方法。
3.1 继承的理解
继承是可以让某个类型的对象获得另一个类型的对象的属性的方法。面向对象的一个重要特性是复用性,继承是实现复用性的一个重要手段。继承允许我们根据一个类来定义另一个类。当创建一个类时,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。
3.2 继承的实现
继承概念的实现方式有二类:实现继承与接口继承。
- 实现继承:指直接使用基类的属性和方法,无需额外编码。
- 接口继承:指仅使用属性和方法的名称,但是子类必须提供实现。
二者的区别是:使用实现继承,实现了父子类的属于(IS-A)关系,比如上面说的猫是动物,田园猫是猫。使用接口继承,则标识的是子类能做什么。
3.3 继承的优缺点
- 去掉重复代码。
- 可以实现多态。
- 侵入性强。
4、多态
接着上面动物的例子来说。动物都会叫,但每种动物的叫法不同,猫是喵喵喵~,狗是汪汪汪~,猪是哼哼哼~,都是叫,但他们最后表现出来的声音不同。
4.1 多态的理解
多态(Polymorphism),可以理解为同一个行为展现出不同的形态。多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是每个类以不同方式实现相同属性或方法。
4.2 多态的实现
多态分为静态多态和动态多态。
4.2.1 静态多态
在静态多态中,函数的响应是在编译时发生的,也叫编译时多态。在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。
静态多态主要指方法的重载。
4.2.2 动态多态
动态多态指程序中定义的对象引用所指向的具体类型在运行期间才确定,也叫运行时多态。
动态多态有三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象
动态多态的实现方法:
- 接口+实现,即一个接口多个实现。
- 抽象类+实现,即子类重写父类中的方法。
4.3 多态的优缺点
4.3.1 优点:
- 提高了代码的维护性
- 提高了代码的扩展性
- 可替换性
- 灵活性
4.3.2 缺点
- 不能使用子类的特有属性和行为