大学时期从C++编程语言学起,然后一直在学习面向对象语言C#, 学习的过程仅仅停留在 “会用” 的层面,对于编程语言的 “设计思想” 思考甚少,以至于在读这本书之前,甚至无法从根本上解释为什么一定要有初始化函数、为什么要进行访问权限控制等问题。
最近读了《Java编程思想》作为java的入门书,这本书读起来有种高屋建瓴的感觉。本文主要记录这本书读书笔记,首先对面向对象程序设计做一个概括,然后分别介绍面向对象的抽象、封装、 继承、多态等特性,争取对面向对象语言JAVA的设计思想有个清醒的认识。
1.面向对象编程(OOP)概述
从机器代码、汇编语言、面向过程语言(C等)到面向对象语言是一个抽象化程度越来越高的过程,例如面向过程语言也要基于计算机结构进行设计,而面向对象语言则只需从要解决的实际问题进行建模。随着抽象的程度越来越高,入门起来也越简单。
什么是对象?一个对象是相应“类型”的实例,“类型”是对待解决问题的抽象。例如要建立汽车模型,可能需要轮子、发动机等“类型”,则一个汽车对象就有轮子、发动机等对象共同组成。“类型”对应java中类的概念,用关键词class来表示。
在面向对象编程的世界里,程序就是对象的集合,这些对象之间通过发送消息(即调用对象的方法)来通知要做的事。开发人员的目标就是将对象视为一个个服务提供者,将需要实现的服务分解为对象的集合,然后创建出能够提供理想服务的这些对象。
2. 类的组合、继承
想象一下当你终于写出来一个类,经过测试,它实例化出的对象能够提供理想的服务。这段代码的命运是否就结束了?结果就是开始思考如何能让写的类能够复用。就像积木一样,设计的形状越一般化,很多地方都可以用,像机器人的帽子部件不能组装身体。
如果我们有一些可复用的类,则可以用它们合成一个新的类,实现组合服务。实现组合的方法就是将复用类的对象添加到当前类中。组合关系也称为 has-a 关系。
在创建了一个类A后,即使另一个类功能和它非常相似,也要新创建一个新类。那么能不能利用已有的类少写点代码呢?我们可以在A类的基础上复制一份,然后在这个副本上添加或修改一些功能来创建新类,通过继承便可以实现这一想法。
例如形状类有绘制、擦除等方法,从形状类中可以继承出三角形、圆形、矩形等子类,每个子类中虽然一些方法和父类相同,但求面积的方法各异。
通过继承得到的子类的类型和父类相同。三角形也是形状。
3.多态
有时不想将某个对象按照所属的特定类型来对待,而作为它的父类对象来对待。这样就可以写出不依赖特定类型的代码,代码就不会被新添加的子类影响,那么扩展子类就非常方便了。
例如,形状类中的方法操作的都是泛化的形状,不管是三角形、圆形、还是其他各种形状。当从形状类中继承一个新形状五角星时,并不需要修改处理泛化形状的代码。
那么如果三角形想让泛化形状的方法绘制自己时,该怎么让编译器知道?
OOP中使用了后期绑定,当向对象发送消息时,调用的代码直到程序运行时才能确定。关于动态绑定的具体实现见《java学习笔记之动态绑定技术》。
4.访问控制
为什么要进行访问控制?
程序开发人员按照角色可以大致分为两类:创建工具类的生产者、在自己的程序中使用工具类的消费者。生产者创建的类往往只给消费者看到必要的一部分,而隐藏更多的实现细节。这样做一是生产者可以改动隐藏的细节而不影响类的使用,二是防止不专业的消费者对类中重要的实现细节进行破坏。
例如现实当中的火锅底料一般只写着使用方法,而不会写具体的配方。因为对于普通的用户而言,只要根据食用方法来做就可以了,没必要了解其中各种调料的配比、熬制方法等细节。如果把火锅底料视作一个类,食用方法就是暴露给消费者的部分,配方就是实现细节。当配方稍作调整的时候,并不会影响用户的食用方法。
java中用Public、private、protect设定访问权限。