似乎从接触编程开始我们就一直能听到有人对我们说:java是一种面向对象的编程语言,c是一种面向过程的编程语言。企业的招聘简历上也会时不时的添加一句:拥有面向对象的编程思维。面向对象众所周知是一种编程思维,编程语言就是用面向对象的方式抽象了整个世界。一直以来我对这种思维只是简单的知道了解,最近看了好多大师的视频和博客,才发现面向对象的思维真的是建模事物的最好方式。
由于本人java程序员出身,所以仅以java代码为例,聊一聊自己对面向对象的理解。
众所周知,java编程语言中有两个很重要的概念:类和对象。类是什么?类就是对事物的抽象,包含两部分,一部分是类的属性,一部分是类的动作。比如:鸟就是一个类,可以有翅膀的属性,可有羽毛的属性等等,还有可以有飞的动作,站立走动的动作等等。而对象呢是对类的具体实现。比如:某一只鸟就是鸟对象的实例。
讲完了概念,好了我们现在可以使用这些概念来抽象整个世界了。显示的世界中会时时刻刻的发生各种动作各种事情,比如:人开门、人踢球、学生上学等等,下面我们就来抽象一下人开门这个动作。
人开门,这个动作涉及到了两个事物,人和门,所有我们需要抽象出两个具体的类,人类和门类。
先抽象人这个类,只有一个简单的属性:姓名
下面我们抽象门这个类。
想想开门的动作就是把门的状态从关着的状态转化为开着的状态,其中还有许多其他的变化,如:门的角度发生变化,门侧边的位置发生变化等等,现在我们先暂时不考虑这些问题,我们就是最简单的记录门的状态发生变化,及门类有一个属性是记录现在是开门状态还是关门状态。
具体开门这个动作呢?这个动作及这个方法是人需要有的动作还是门的动作?可能有些人这里就会有分歧了,有的人说开门这个动作是人类里面的方法,有的人可能认为这是门类需要有的方法。这里其实涉及到我认为的面向对象的一个重要的设计原则了,及谁有属性,对属性的操作就应该是谁的,门的状态这个属性既然是门的那么开门这个动作就应该是门类应该有的。
所以到现在问题就比较简单了,下面我们抽闲出我们自己的门类。
下面编写客户类,调用我们的开门动作,并查看运行结果:
总结:面向对象的编程思维,就是要求我们把事物分成两部分:属性和动作,对属性的动作一定是归属于属性的所有者,及:人开门,开门这个动作的描述是:门的状态发生改变,门的状态这个属性是属于门的,所以开门这个动作也将是门的动作!理解了这一点,你会发现:人踢球,手拿包,去上学等等真是世界的各种动作,活动都可以在程序的世界中展示了,属性越多,越全,对真实情景的描述就越真实!