就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会说,没有类,哪里来对象呢?其实不然,这个问题很经典,考的就是oo思想和软件工程的意识。
我经历之后的收获:面对问题,首先分析提问的角度,看清问题
这样问,显然对方是在考察被考者,oo思想掌握程度和软件工程的意识,都说在OO中,换句话就是在面向对象思想里(包含各行各业)……自然不需要在乱想什么内存角度,计算机角度,底层机制,甚至汇编都来,没意义……这样想的思路本身就错的!
提问者考的不是这个,而且不是每一个面试官或者老师提问都要一字一字的说明白,当时时间有限,思考时间也有限,必须快速作答,给出结论。他们没这个义务和必要,选拔性质嘛!就比如孙悟空能理解菩提老祖,打三下,扭头看月亮的含义,别人理解不了,还以为孙悟空那样想是傻x呢……
故我们需要一定的分析提问和找准角度的技能!既然是去求职,或者被考察,自然要学会如何搔到对方的痒处,lz记得,当初这个问题,本科科班出身的,没回答对的,几乎都被刷了……本科阶段去面试过的那家公司,同样的问题,回答者就和评论一样,千奇百怪,振振有词者不少。但是少有说到点子上的,或者说少有骚到了面试官痒处的人。包括lz,当初回答的理由也不让人满意。
问题本身来看:这个问题本身不难
属于知道就是知道,不知道就是不知道。属于看清问题,具有oo思想和软件工程意识就能答对,看不清问题就乱说一气的问题类型。
评论说:
这个问题很无聊,or lz遇到的问这个问题的人是傻x ,or 这是没有解的题,非要标准答案,属于强加观点给别人,or lz是sb……唉,看了看删除了一些出口就是脏字的非人类评论。
我个人认为,不能有问题上来就想到code,如果不是逆向和硬件,那么对于应用程序开发者,一上来就思考计算机的底层,并不是好事。故有人抬杠,一直说没有类,怎么new对象的反问来反驳……
lz在那之前,没有思考提问问题角度 or 回答思路的习惯。题目看不懂,总是抱怨对方为什么不说明白了,问题角度不同,答案不同,总是一筹莫展,不知回答哪个。
后来见到了实验室的老板,包括一些公司的部门老大,真的,当你周围存在一些竞争对手,且水平有的比你还高的时候,回答人家的问题,必须要思考对方提问的角度和回答的思路,否则死的很惨。不论什么样的问题,当lz踌躇,犹豫,骂提问者脑残,傻x的时候,总有人比你快,先你一步,得出对方满意的答案,不服不行,这就是能力!lz吃过亏。
确实是因为问题角度不同,所以答案不同。比如一个很无聊但是能说明问题的例子,如果是面试小学数学老师,问你1+1=多少,自然是2,面试哲学老师,答案就不一定是2,面试文艺类的老师职位,答案更可能千奇百怪。
但是我们这个问题的环境来看,角度很明确。环境是求职面试,或者研究生复试,前提是各行各业都可能有的面向对象思想,故你没得理由上来就辱骂对方是傻x,你必须给出个所在领域的合适的结果。对方就是在问,思想境界里,先有对象还是先有类……如此而已,不用扯什么汇编和其他OO语言的程序设计。比如,lz就知道在综合面向过程和面向对象的c++语言里,类是不被分配内存的,编译器把类看成一种新的数据类型来理解,只有生成对象的时候,对象是被分配内存的。好比,int类型不会被分配内存空间。但是在其他OO语言里,不一定是这样的。
想综合自己的看法分析下,我也不是技术大牛,我只是结合我的经历和认知在分析。还有,除了上述的几类,如有不同意见,欢迎文明评论!
软件开发的过程
先经过需求分析,然后概要设计,详细设计,之后才是编码,测试等,那么开始的分析和设计阶段,面向对象思想的程序,必然是先设计类,类的设计来源于对象的抽象。
类的定义
类的定义:类(Class)实际上是对某种类型的对象定义变量和方法的原型。是具有相同属性和操作的一组对象的集合!它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。看到这里,已经无需多言,标准答案,是先有对象,再有类。
面向过程简单说明
从功能角度出发去分析问题,把问题解决方案分解为步骤或者说是模块!这类结构化的思维特点是自顶向下去设计程序,尽量的结构化组织架构,把各个模块的各部分元素实现低耦合,高内聚(相对来说),编写程序主要使用结构化的语法——顺序,分支,循环。通俗的说:程序= 数据结构 + 算法。把各个模块或者步骤分开设计,编码,测试,最后再统一为一个有机整体!故面向过程语言也叫命令型语音。使用函数分解法,把函数分解的尽量小,足够简单,一种类似迭代的设计。实现高度模块化!
好处:一目了然,有条理
缺点:不利于维护,因为软件开发最难的地方在于后期维护(包括营销推广、bug修正,和软件的升级等),因为面向过程把数据和方法分离!导致了数据管理混乱,理解困难,重用性差,容易产生串联改变!
面向对象简单说明
oop,ood,是一种接近或者相似于我们人的思考方式的一种程序设计方法,OO,重点就是类的设计!比如造汽车,不需要第一关心去设计一步步的制造步骤,而是先去设计类,假如车门类,发动机类,外形类,轮胎类,动力类,颜色类,容量类,排量类等,不需要第一就去关心各个组织模块的功能如何实现,而是先去关心各个类的设计,把数据和方法封装不分离!独立为一个整体,让类的实体——对象,通过给各个独立的这些类发送消息,驱动他们有机的运转!
在OO里,程序=对象+消息,且至少要有三大特点(递进关系):封装,继承(多态的基础),多态。
再次强调,OO中,先有对象后有类。
总结:
类似“OO中,or OO思想,先有对象还是先又类”,不存在什么争议,考察的就是OO思想和软件工程的意识,因为它流行,很多软件在使用。如果有企业面试,问这个问题,结果不是这个,那么你可以扭头就走。
欢迎关注
dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!