OOP:面向对象编程
一. 什么是OOP
面向对象编程:Object-oriented Programming,OOP,面向对象程序设计。
面向对象编程是一种计算机编程架构,他的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
OOP使得程序更有重用性、灵活性和扩展性。OOP的核心思想是:封装、继承、多态(重点是类和对象)。
不同于POP(面向过程编程)的以过程为中心的编程思想,面向对象编程的中心思想是通过调用对象来实现想要实现的目的。
面向对象的思想:
- 是一种更符合我们思想习惯的思想;
- 可以将复杂的事情简单化;
- 将我们从执行者变成了指挥者。
二. OOP的特点
1. 封装
封装,简单来说就是将重复的代码通过一种方法,编程一个新的可以被我们直接调用的类,省去了繁复的编程过程。封装可以使得代码实现“高内聚、低耦合”,这种状态也是封装的基本目标。对用户来说,用户并不需要知道对象是如何进行各种操作的,用户只需要通过调用封装后类的对象来进行想要的操作即可。封装这种思想,大大简化了操作步骤,代码变得更加有效,复用性也更高。
封装还有另外一个目的,就是将不需要对外提供的内容都隐藏起来;把属性隐藏(private关键字),提供公共方法对其访问。这使得用户不能直接访问程序的详细细节,从而使得代码的安全性的到提高。
2. 继承
继承是两者或两者以上的类之间的关系。顾名思义,继承就是子类包含父类所有的特点,但子类自身还可以有自己的特有方法(子类对象 is a 父类对象)。继承可以分为单继承和所继承:单继承是说,一个对象仅仅从另外一个对象中继承其相应的特点;多继承意思是,一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力,并且不会发生冲突等现象。在Java代码中,只能实现单继承,其他的编程语言中有些可以实现多继承(Java中可以通过extends修饰子类,使子类可以继承父类的非私有成员)。
继承在实现代码的复用性和维护性的同时,也使得类和类之间更加依赖,就是说继承也增加了代码的耦合性(一个类要完成某项功能要依靠另外的某些类叫耦合)。而软件设计原则是:高内聚(一个类单独完成某项功能的能力),低耦合。
在java程序中,object是所有类的顶层父类,所有类都直接或间接继承它。并且父类私有的成员子类无法继承(父类中被private关键字修饰的内容)。另外构造方法不参与继承,子类虽不继承父类的构造方法,但是可以用super关键字访问父类的构造方法;如果父类有构造,因为子类继承父类的时候要继承或使用父类的数据,所以在子类初始化前让父类的构造先执行。创建子类对象的时候先执行父类的构造再执行子类的构造。
3. 多态
继承是多态的前提
多态就是指调用相同名字的方法,但是得到的结果是不同的。多态是作用在方法上的,不作用在类或对象,也不是对象中的属性。多态的产生是因为我们需要程序能够分别应对各种情况,多态在增加代码灵活性的同时满足用户的需求。
要使得多态产生就必须实现方法重写(子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),就会发生方法重写,子类的方法覆盖父类的方法),或方法重载(允许一个类中,出现多个同名方法,只要参数个数或参类型不同即可)。
多态在提高代码扩展性的同时也拥有继承的特点(复用性和维护性)
三. OOP的优点
1. 好学
传统的面向过程程序设计,以算法为核心,将数据和处理过程分开,虽然更加反映计算机的观点,但是代码的可读性就降低了,也就是说代码更难懂。而面向过程编程中,重复代码可以封装,类与类之间又可以通过继承来得到许多方法,也有多态的现象来处理信息,这些特点就在减轻程序员负担的同时,使得初学者可以更好的理解代码,不用直面像面向过程编程中的算法。
2. 稳定
用传统的面向过程方法来实现模块化技术时,一个很大的障碍是无法实现同一模块的多次同时运行。用面向对象技术中的类来实现模块,用类的实例化,对象块用队列类来实现,类中包含了队列的各种操作。以这个队列为模板可以产生多个队列对象。每个对象都有相同的方法。但却可以独立地同时运行,应用于系统的不同场合,从而方便地解决了这个面向过程开发中颇为棘手的问题。
3. 维护性好
在维护代码的过程中,面向对象编程的代码由于可读性更高所以维护的难度也就更小。通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度。
4. 可复用性强
由于代码实现了封装,这就使得代码的复用性很高。代码本身实现功能划分,但总体上又有很好的关联。通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级。
四. OOP的缺陷
1. 运行效率低
由于在程序编写的过程中追求封装的思想,会创建大量的类,而类的加载会牺牲系统性能,使得运行速度降低。即使CPU的速度和内存的容量在提高,但是面对大规模的代码,运行效率的问题还是会显现出来。
2. 类库很庞大
由于类库都过于庞大,程序员对它们的掌握需要一段时间,从普及、推广的角度来看,类库应在保证其功能完备的基础上进行相应的缩减。
3. 类库的可靠性
越庞大的系统必会存在我们无法预知的问题隐患,程序员无法完全保证类库中的每个类在各种环境中绝对的正确,当使用的类发生了问题,就会影响后续工作,程序员也有可能优于一个类的错误推翻原来的全部工作,这就给编程和维护的过程带来了难度。