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思想和软件工程的意识,因为它流行,很多软件在使用。如果有企业面试,问这个问题,结果不是这个,那么你可以扭头就走。
OO中,先有对象还是先有类?的更多相关文章
- java中map和对象互转工具类的实现示例
在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map ...
- 在 C++ 中使用 QML 对象
看过了如何在 QML 中使用 C++ 类型或对象,现在来看如何在 C++ 中使用 QML 对象. 我们可以使用 QML 对象的信号.槽,访问它们的属性,都没有问题,因为很多 QML 对象对应的类型,原 ...
- .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...
- python中一切皆对象的理解
一切皆对象? 学过Java都知道,Java中有8个基本类型,其余的都是继承自Object类的引用类型.方法内的基本类型变量会在栈上分配,而引用类型会通过逃逸分析来决定在栈上分配或堆上分配.Java中关 ...
- C#开发中使用配置文件对象简化配置的本地保存
C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor
批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- 9.Struts2在Action中获取request-session-application对象
为避免与Servlet API耦合在一起,方便Action类做单元测试. Struts2对HttpServletRequest.HttpSession.ServletContext进行了封装,构造了三 ...
- 关于Javascript中通过实例对象修改原型对象属性值的问题
Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的 ...
随机推荐
- jq随手写图片放大
html: <img id="img1" src="<?php echo $info->business_licence_img; ?>" ...
- maven内部运行原理解析
maven至今还是Java编程语言构建的事实标准,大部分项目还在使用maven来进行构建,因此了解maven内部运行的原理对定位和分析问题还是很有裨益的.本篇文章主要介绍一些maven内部运行过程中的 ...
- C语言两种查找方式(分块查找,二分法)
二分法(必须要保证数据是有序排列的): 分块查找(数据有如下特点:块间有序,块内无序):
- 【TJOI&HEOI2016】【Bzoj4551】树
这道题是可以用树链剖分来做的,但其实有比它更加简单的做法--并查集. 可以想到,这类题的一种常见做法是离线处理,先全部读入,再从后往前处理,每次遇到标记操作,就把这个点的标记次数减一,到零以后就把这个 ...
- Form表单中的get和post的区别
method="get/post",两种方式的区别 Form中的get和post方法,在数据传输过程中分别对应了GET和POST方法.二者主要区别如下: 1.Get将表单中数据的按 ...
- 面试题系列——OSI七层模型
OSI(开放式系统互联模型)是一个开放性的通行系统互连参考模型,是一个协议规范.它把网络协议从逻辑上分了七层,每一层都有对应的物理设备. OSI七层模型是一种框架性的设计方法,设计的主要目的是为了解决 ...
- 一步步学习javascript基础篇(6):函数表达式之【闭包】
回顾前面介绍过的三种定义函数方式 1. function sum (num1, num2) { return num1 + num2; } //函数声明语法定义 2. var sum = funct ...
- 几个毫无节操纯属恶搞的JavaScript插件
fartscroll.js,为放屁而生 你知道么,有了这个js库,你的页面就可以——————————放屁勒! 打开下面的演示地址,然后滚动页面. 在线演示:http://theonion.github ...
- [变]C#谜题(1-10)表达式篇
[变]C#谜题(1-10)表达式篇 最近偶然发现了<Java谜题>,很有意思,于是转到C#上研究一下. 本篇是关于表达式的一些内容. 谜题1:奇数性(负数的取模运算) 下面的方法意图确定它 ...
- UITest 单元测试常用的断言
XCTFail(format…) 生成一个失败的测试: XCTFail(@"Fail"); XCTAssertNil(a1, format...) 为空判断, a1 为空时通过,反 ...