目录

1. 什么是OOP

2. 面向对象的三大特性:

2.1 封装

2.2 继承

2.3 多态

3. OOP的优缺点

3.1 优点

3.2 缺点

4. OOP设计模式六大原则


1. 什么是OOP

什么是OOP,Object Oriented(面向) Programming,即面向对象编程。很早很早以前的编程是面向过程的,我们提到的面向对象编程的优点,一般是和面向过程编程POP(procedure oriented Programming) 对比的。

2. 面向对象的三大特性:

2.1 封装

理解封装就要先理解 -- 对象:一切事物皆对象;
          -- 抽象:是提取、想象成 的意思。
封装就是把生活中的一切事物、动作、过程 抽象成对象(在Java中的存在形式是类、接口或是方法)。对象有自己的属性和实现细节,仅对外提供公共访问方式,便于使用,提高复用性和安全性。

  • 封装可以使得代码实现“高内聚、低耦合”,这种状态也是封装的基本目标。对用户来说,用户并不需要知道对象是如何进行各种操作的,用户只需要通过调用封装后类的对象来进行想要的操作即可。封装这种思想,大大简化了操作步骤,代码变得更加有效,复用性也更高。
  • 封装还有另外一个目的,就是将不需要对外提供的内容都隐藏起来;把属性隐藏(private关键字),提供公共方法对其访问。这使得用户不能直接访问程序的详细细节,从而使得代码的安全性得到提高。

2.2 继承

我们抽象出的对象是来描叙具体的事物的,但是这些事物都是独立的,彼此之间没有应该有的联系,这样的孤立设计并不符合现实逻辑,让事物之间的联系得到描叙,我们就需要继承。用继承的关系把这两个现实的事物联系起来,这样我们就能设计出不孤立的类,而是和其他类有联系的类。

  • 在Java代码中,只能实现单继承,其他的编程语言中有些可以实现多继承(Java中可以通过extends修饰子类,使子类可以继承父类的非私有成员)。单继承是说,一个对象仅仅从另外一个对象中继承其相应的特点;多继承意思是,一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力,并且不会发生冲突等现象。
  • 继承在实现代码的复用性和维护性的同时,也使得类和类之间更加依赖,就是说继承也增加了代码的耦合性(一个类要完成某项功能要依靠另外的某些类叫耦合)。而软件设计原则是:高内聚(一个类单独完成某项功能的能力),低耦合。
  • 在java程序中,object是所有类的顶层父类,所有类都直接或间接继承它。并且父类私有的成员子类无法继承(父类中被private关键字修饰的内容)。另外构造方法不参与继承,子类虽不继承父类的构造方法,但是可以用super关键字访问父类的构造方法;如果父类有构造,因为子类继承父类的时候要继承或使用父类的数据,所以在子类初始化前让父类的构造先执行。创建子类对象的时候先执行父类的构造再执行子类的构造。

2.3 多态

继承是多态的前提。
子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。

  • 多态是作用在方法上的,不作用在类或对象,也不是对象中的属性。多态的产生是因为我们需要程序能够分别应对各种情况,多态在增加代码灵活性的同时满足用户的需求。
  • 要使得多态产生就必须实现方法重写(子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),就会发生方法重写,子类的方法覆盖父类的方法),或方法重载(允许一个类中,出现多个同名方法,只要参数个数或参类型不同即可)。
  • 多态在提高代码扩展性的同时也拥有继承的特点(复用性和维护性)

3. OOP的优缺点

3.1 优点

  • 好学
    传统的面向过程程序设计,以算法为核心,将数据和处理过程分开,虽然更加反映计算机的观点,但是代码的可读性就降低了,也就是说代码更难懂。而面向过程编程中,重复代码可以封装,类与类之间又可以通过继承来得到许多方法,也有多态的现象来处理信息,这些特点就在减轻程序员负担的同时,使得初学者可以更好的理解代码,不用直面像面向过程编程中的算法。
  • 稳定
    用传统的面向过程方法来实现模块化技术时,一个很大的障碍是无法实现同一模块的多次同时运行。用面向对象技术中的类来实现模块,用类的实例化,对象块用队列类来实现,类中包含了队列的各种操作。以这个队列为模板可以产生多个队列对象。每个对象都有相同的方法。但却可以独立地同时运行,应用于系统的不同场合,从而方便地解决了这个面向过程开发中颇为棘手的问题。
  • 维护性好
    在维护代码的过程中,面向对象编程的代码由于可读性更高所以维护的难度也就更小。通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度。
  • 可复用性强
    由于代码实现了封装,这就使得代码的复用性很高。代码本身实现功能划分,但总体上又有很好的关联。通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级。

3.2 缺点

  • 运行效率低
    由于在程序编写的过程中追求封装的思想,会创建大量的类,而类的加载会牺牲系统性能,使得运行速度降低。即使CPU的速度和内存的容量在提高,但是面对大规模的代码,运行效率的问题还是会显现出来。
  • 类库很庞大
    由于类库都过于庞大,程序员对它们的掌握需要一段时间,从普及、推广的角度来看,类库应在保证其功能完备的基础上进行相应的缩减。
  • 类库的可靠性
    越庞大的系统必会存在我们无法预知的问题隐患,程序员无法完全保证类库中的每个类在各种环境中绝对的正确,当使用的类发生了问题,就会影响后续工作,程序员也有可能由于一个类的错误推翻原来的全部工作,这就给编程和维护的过程带来了难度。

4. OOP设计模式六大原则

4.1 开闭原则(Open Close Principle)

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

4.2 单一职责原则(Single Responsibility Principle)

一个类只负责一个职责。

4.3 里氏替换原则(Liskov Substitution Principle)

子类替换父类(可以用父类对象的任何地方都可以用子类对象代替)

4.4 依赖倒置原则(Dependence Inversion Principle)

程序要依赖于抽象接口,不要依赖于具体实现。
要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

4.5 接口隔离原则(Interface Segregation Principle)

设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

4.6 迪米特法则(Law Of Demeter)

一个对象应该对其他对象保持最少的了解。

文章来源:https://www.jianshu.com/p/7fec7ca87fa2
 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐