就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,想综合自己的看法分析下:如有不同意见,欢迎评论!
面向过程简单说明
从功能角度出发去分析问题,把问题解决方案分解为步骤或者说是模块!这类结构化的思维特点是自顶向下去设计程序,尽量的结构化组织架构,把各个模块的各部分元素实现低耦合,高内聚(相对来说),编写程序主要使用结构化的语法——顺序,分支,循环。通俗的说:程序= 数据结构 + 算法。
把各个模块或者步骤分开设计,编码,测试,最后再统一为一个有机整体!故面向过程语言也叫命令型语音。
比如,去饭店吃炒菜,点炒西红柿,面向过程思维就是第一时间去一步步的去思考炒菜的过程,分解为不同模块,第一步干什么,然后干什么,该放糖还是放盐了等等。使用函数分解法,把函数分解的尽量小,足够简单,一种类似迭代的设计。实现高度模块化!
好处:一目了然,有条理
缺点:不利于维护,因为软件开发最难的地方在于后期维护(包括营销推广、bug修正,和软件的升级等),因为面向过程把数据和方法分离!导致了数据管理混乱,理解困难,重用性差,容易产生串联改变!
面向对象简单说明
oop,ood,是一种接近或者相似于我们人的思考方式的一种程序设计方法!就是说,我们去饭店吃饭,正常人不会第一时间去考虑这个菜是怎么做的,只考虑菜这个对象(价格,名气,食材等),xxx饭店这个对象(口碑等),菜做好了,让服务员端过来给我们吃……
即:围绕真实世界的实体概念来组织模型!面向对象方法的产生也是如此,先看到一个个存在的实体,小孩儿,大人,老人,男人,女人等人类的实体。狗,猫,狮子,大象等动物的实体,菊花,茉莉,丁香,柳树等植物的实体。这些我们是实实在在看到的,摸得着的实体对象!这是符合人类最初去看问题的思维方式!
紧接着,考虑到,狗会吠,猫会喵,大象体积大,狮子吃肉,凶猛,男人强,女人妩媚,小孩儿可爱,老人抖擞,等等,这些针对各个实体对象的特点(也就是程序设计的对象的属性),人们不禁想到,一些特点的共性问题,于是乎,产生了抽象的概念!把猫,狗等聚集为一个共同的模型,动物类!男人,女人等聚集为一个共同的模型,人类!
这是符合人类的思考过程,先有实体的对象,然后在程序设计里,想方设法去把对象抽象为整体,设计为一个个的类,对象的特点成为了属性——类的成员变量,共性的行为抽象为了方法。
OO,重点就是类的设计!完成对实体对象的建模,比如造汽车,不需要第一关心去设计一步步的制造步骤,而是先去设计类,假如车门类,发动机类,外形类,轮胎类,动力类,颜色类,容量类,排量类等,不需要第一就去关心各个组织模块的功能如何实现,而是先去关心各个类的设计,把数据和方法封装不分离!独立为一个整体,让类的实体——对象,通过给各个独立的这些类发送消息,驱动他们有机的运转!
在OO里,程序=对象+消息,且至少要有三大特点:封装,继承,多态。
从科学角度去说
目前在地球上已知的,只有人,是高级动物,人才有理性思维,人具有抽象的思维和能力,必然是这样的,不要抬杠。
实际上,人存在之前就已经有各种各样的对象了,难道不是么?
比如宇宙,多少多少多少……亿年之前就有了。而那时候,尼玛人连毛都没有呢!而宇宙本身就是实际存在的(抬杠的会说,宇宙之前是什么, 这连科学家都没定论完毕,好么,只是猜想,但绝对还是对象!),而宇宙里面,这些被后来的人类!去称为行星,恒星,黑洞等的实体大物质块,是确确实实的早就存在的实体对象!
恰恰是这个所谓的类!是拥有了高度智慧(相对来说)的人类,动用进化后的发达的脑部(相对来说)给人为的去抽象出来的,什么恒星,行星,卫星,银河系,太阳系,这尼玛没有人之前,谁知道叫这个,星星自己都不知道,它竟然是恒星!她竟然是银河系的物质块(后来人们给这些物质块定义的星球的概念)。
从哲学角度去说
俗话说,物以类聚,人以群分。古代人就知道,物聚集起来才有了类,再次强调,先有对象后有类。比如,肉,在人类出现之前,就有动物存在,这些实体,都是有肉的,但是那时候叫肉么?再比如,人类,人类,还不是我们自己给自己起的名字!假如开始的时候不叫人类,叫鸡类,现在我们就是鸡了。不是人了。但是这些实体,确实早就存在!抽象概括的是后来的。
总结:
如果有企业面试,问这个问题,结果不是这个,那么你可以扭头就走。