zoukankan      html  css  js  c++  java
  • OO中,先有对象还是先有类?

    就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在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电子书,资料,帮忙内推,欢迎拍砖!

  • 相关阅读:
    背水一战 Windows 10 (26)
    背水一战 Windows 10 (25)
    背水一战 Windows 10 (24)
    背水一战 Windows 10 (23)
    背水一战 Windows 10 (22)
    背水一战 Windows 10 (21)
    背水一战 Windows 10 (20)
    背水一战 Windows 10 (19)
    背水一战 Windows 10 (18)
    背水一战 Windows 10 (17)
  • 原文地址:https://www.cnblogs.com/kubixuesheng/p/4132116.html
Copyright © 2011-2022 走看看