面向对象是什么概念

2020-05-22 13:54发布

8条回答
爱吃鱼
2楼 · 2020-05-22 15:37

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构zd、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术 发展到一定阶段后的产物。


起司甜饼
3楼 · 2022-08-19 16:08
这是一个非常好的问题,建立面向对象编程思想是学习面向对象编程的关键,下面就把面向对象思想做一个总结。什么是面向对象思想呢?简单的说就是考虑问题以对象为出发点而不是以流程为出发点,通过对象之间的交互完成一系列功能的实现,这就是面向对象思想。对象又是什么呢?简单的说就是一切都是对象,对象能够涵盖所有我们已经认知的事物和未认知的事物,只要是存在的东西都可以认为是对象,比如“黑洞”、“暗物质”等等,所以对象的范围非常广泛。面向对象思想如何落地呢?面向对象编程思想包括四个概念、三个特征、一个过程,下面分别解释一下(以Java语言为例):四个概念分别是类、对象、属性和方法,其中类表示定义,对象表示类的实例,属性表示对象的状态,方法表示对象的功能。举个例子,比如我们要通过面向对象的思维方式来描述学生,那么就需要为学生构建一个类:类中定义了学生的学号和姓名,同时定义了一个打印学生信息的方法,这就是类,但是类只是一个定义,要想完成具体的应用,需要通过类来创建出一个实例,这个实例就是对象,看一个例子:例子中通过构造方法创建初始化了一个实例,这个时候,这个实例就是一个实实在在存在的对象了,此时这个对象就可以调用方法来实现功能了。通过这个例子,我们可以了解类、对象、属性、方法之间的关系,同时也阐述了面向对象的编程过程,这个过程分为三个步骤,分别是类的定义、对象的创建、方法的调用。三个特征分别是封装、继承和多态,其中封装提高类的内聚性,封装包括三个步骤,分别是私有化成员属性、定义设置器、定义获取器,看一个例子:继承是在一个类的基础之上再派生出一个新类的过程,通过继承,子类能够完成对父类方法的继承,看一个例子:继承体现的是一种发展的概念,是面向对象编程过程中的一个重要概念。多态的理解是一个稍微麻烦的事情,但是简单的总结一下,多态可以用两个方法和三个定义来描述多态。两个方法分别是方法重载和方法重写,三个定义分别是父类定义子类构建、抽象类定义实体类构建、接口定义实体类构建。先看一下方法重载,方法重载简单的说就是同一个类中定义了多个方法,具有相同的名字,不同的参数列表,看一个例子:方法重写简单的说就是一个前提、三个相同、两个规定,一个前提是在继承体系结构下,子类定义了某个方法与父类的方法具有相同的名字、参数列表、返回值类型,两个规定分别是子类方法的范围限定不能小于父类方法,子类方法不能抛出更多的异常,看一个例子:下面再看一下三个定义,三个定义是理解多态的重点,也是一个小难点。第一个定义是父类定义子类构建,看一个例子:第二个定义是接口定义实体类构建,看一个例子:第三个定义是抽象类定义实体类构建,看一个例子:以上内容就是对面向对象编程思想的一个简单描述,面向对象思想现在已经有了很大的扩展,Spring就是面向对象编程和面向方面编程结合的例子,Spring目前在Java开发领域也有广泛的应用。
甜桃兔丸
4楼 · 2022-08-19 16:08
面向对象是程序设计的方法之一,也是目前最为流行的设计方法。作为面试问题,考官无非是想知道你会不会实装,懂不懂类,继承,多态,封装这些知识。或者是想知道你会不会设计,懂不懂用例图,配置图,类图,时序图这些知识。相信回答中一定有非常精彩的说明。下面我分享几个代表性的软件设计方法拓展一下知识面吧。面向过程这是最早的结构化的编程思想。它把一个系统分成若干功能模块,然后用输入输出将模块联系起来。C语言,Basic,Fotran等早期编程语言都是以这种思想为基础的。面向过程的设计手法主要是流程图和状态图。特别是状态机,可分为摩尔机和米莉机都是面向过程中非常重要的理论。C语言中的回调函数,VB的事件(event),Oracle存储过程中的Trigger等都是基于状态机理论设计的。面向过程的设计接近于计算机的运算过程,适合于流程控制要求严格的场合,在一些硬件控制的程序设计上仍被广泛采用。不过,功能模块还有状态这些概念跟硬件配置太接近了,在管理系统应用领域运用起来很牵强,导致系统复杂难懂,设计的可靠性能极低。于是,人们开始思考接近管理模型的设计方法。面向数据流这是一种非常接近管理组织结构的设计方法。它把管理体制中的职能作为模块,模块通过数据连成整体,这样就定义了业务模型。按照一定的规则,逻辑模型可以被转化成包含输入输出数据存储和程序模块的物理模型。这被称为结构化的设计思想。面向数据流中逻辑模型和物理模型相结合的思想,大大提高了设计的可靠性,这一思想曾经是现在仍是信息系统设计的标准思路。SQL,ER等语言和设计方法都是从这一思想关系密切。值得一提的是ER模型,它就是面向对象思想的鼻祖。面向对象尽管有了逻辑和物理相结合的结构化思想,程序代码上的耦合性依旧严重影响系统的可靠性。比如,相同的处理被重复地被复制到不同的画面,经多次调试之后出现差异,导致错误。或者,本来不同的处理被强制做成共同函数,使用时不得不用大量分枝导致复杂度激增。为了解决这个问题,引入了对象的概念。最初人们从业务数据中抽出能保持业务特征的最小数据组合作为实体,实体之间用一对一,一对多和多对多来表现关系。这种做法在数据库表结构设计上取得了成功。抽出业务元素的思想被扩展为对象。对象之间的关系定义为继承,多态和封装。虽然不象ER模型那样严密,但对象的概念很实用。被广泛接受。面向对象继承了结构化设计思想,用例图>配置图>逻辑时序图>逻辑类图>物理类图的设计过程更好地实现了准确设计逻辑模型精确设计实装程序的目的。面向服务架构严格地说这个思想已经超越了程序设计的范畴,它的目标是将物理实现集中封装到服务器上,客户端只要关注逻辑运用就可以了。这个思路现在也很普及,SOAP,RPC之类就是这一思想的应用场景。封装物理实现一直都是程序设计的改善目标之一,跟这个思想类似的还有AGENT的思路,就是把功能封装到AGENT上,分布式的电脑网络可以通过调用AGENT实现逻辑功能。这个思路因安全问题被搁置了。现在随着区块链技术的发展,或许AGENT的思想会重现江湖吧。
你算哪块小饼干
5楼 · 2022-08-19 16:08
面向对象的思想主要是把构成问题的各个事务分解成各个对象,在解决问题的过程中围绕着“找对象”,“搞对象”来处理问题。一切皆对象。把很多的处理步骤都交给所创建的对象去处理,通俗简单的来说就是“你办事,我放心”。
西瓜奶昔
6楼 · 2022-08-22 17:01
如果你没有写过代码的话,那么对象很难理解。就当你没写过代码好了简单的说,计算机里运行程序其实就是操作一些数据,而数据是存在内存里的。但是我们不仅仅有一个数据,不同的数据,在内存中存储的位置不一样。如果把内存理解为储物柜,那么内存存放对象的形式就像储物柜的格子,每个格子里存不同的数据,它们之间互不影响。对象呢,就是某个格子中的数据,操作对象,就是找到格子中的数据对它进行计算。面向对象是一种编程思想,包括封装继成和多态。具体的还是要写代码才能懂。
甜味超标
7楼 · 2022-08-22 17:01
除了面向对象,还有面向过程,面向函数。问题里其实也说了,这是一种编程思想。实际上除了面向对象,还有面向过程,面向函数的思想。面向对象的核心是本体论。本体类的核心就是分类,也就是我们词语所指之“物”。当我们说杯子的时候,我们说的其实不是哪一个具体的杯子。我们说的是脱离了时间和空间之外的那个杯子,这种本体论古希腊人都搞明白了,可惜中国古代没有这种本体。比如我们说今天很热,我们翻译过来肯定是想说Today is hot。但是这里我们就错误地把今天作为主语了,其实今天应该是时间副词。英语会翻译成It is hot today这里的It指的是天气,也就是热的主体。本体、分类、集合和名词其实是一回事,这是人类理解世界的根本,就从哲学观点上来看,是我们认识世界的方式。我们的生物需要分类,就是门、纲、目、科、属、种;法律需要分类,轻度伤害、重度伤害量刑不同;社会管理要分类例如不同企业上不同的税;产品需要分类,不同的产品有不同的参数.......我们思想和语言交流的基础就是分类。事实上我们说的每一个名词都是一个分类,当加上编号或者定冠词就变成实例了。分类决定属性,一个分类的属性有两种来源:从爹妈那儿继承的,自己特殊的。当然这个分类也会有孩子继承他的属性。分类决定方法,道理是一样的。重写是一种继承中的变异,大规模重写就没必要分类了;多态是对方法的封装,以便模糊调用,在实际中,操作分类、属性和继承关系的难度很大。我们很多程序员讨厌继承,觉得继承对程序灵活性没好处。确实作为软件开发人员,我们一开始在实践中对我们对业务一无所知,这也是很需要业务专家的原因。对于成熟和不成熟的业务可以分开处理,成熟了就分类,不成熟就都分扁平类,这样能更好地开发。这就是面向对象。面向过程的编程思想实际上也并没有过时也有它自己的用处,当我们操作到一个细节的时候,比如说一个类里面的方法,一定是面向过程的,因为所有工作都可以看做过程。有兴趣可以读一下维特根斯坦的逻辑哲学论,他是面向对象的哲学鼻祖。
朝三暮你
8楼 · 2022-08-22 17:01
面向对象其实是说是一种编程潮流,产生在特殊的年代,也终究会在某天被抛弃,就如同很多年前很多女孩子喜欢李宇春那样中性打扮,现在已经是开始走大长腿风格了,anyway,都是博大家的喜欢, 希望纠结于面向对象是什么的兄弟们,放轻松一点。既然理解技术潮流离不开历史背景,那咱们就来掰掰面向对象的历史吧,也许这里有你想要的答案。 一,起源:图零: 人类最早期的语言在60年代以前, 人类使用的大多数语言应该就是汇编了, 稍微了解汇编的人都知道,当把逻辑分拆到指令集那么细的程度的时候,人类的脑容量是多么的有限,写一个简单的 helloword 是多么的复杂!当然,咱们这个星球上总是有高人或者闲人好事者改进我们的效率,就像瓦特发明了蒸汽机一样。 就在这时 面向对象 的造物主出现了!图一:simula 支持 类 / 对象 / 继承 / 子类 / 虚函数 等特征60 年代发明的 SIMULA语言 是第一个支持 类,对象,继承 等特性的编程语言,但是因为发明者总是天天泡在挪威的实验室里面,SIMULA并没有在工业界推广开来。不过金子总是会发光的,70年代, 犹他大学的 Alan Kay教授 发现了 SIMULA 这种语言跟当时其他语言的与众不同: SIMULA 中对象的概念可以让很多没编过程的人轻松写出一个能用的程序来。 认识到SIMULA 的巨大潜力后,他并没有开始推广SIMULA,而是呢,,,, 他就开始抄袭了, 发明了Smalltalk 语言, 而且把它卖了赚了大钱。图二:Alan Kay教授本尊二,流传:在70年代末期,同样受到 Bjorn Stroustrup 将 C语言 和 SIMULA中(类 / 对象 / 继承 / 子类 / 虚函数)等特征全盘接受并重新整合,且增加了 封装 的特性,形成了C++ 语言。 到这里想必大家也明白了,程序员们总结了 SIMULA 中的特征, 然后把这些特征聚合起来总称为 面向对象 的概念, 然后发现这个概念中的不足,对这个概念进行调整,添砖加瓦。 自从C++ 发明之后, 这个语言可以说是席卷全世界, 整个工业界上到应用程序,下到操作系统,都开始使用C++ 作为开发语言。 于此同时,面向对象的概念像一个火种在工业界开始火速蔓延了。 题外话: 我觉得编程语言的概念真类似各种股票概念,比如雄安概念股,腾讯概念股, 华为概念股,阿里概念股。 一个公司可以带火一个概念!图三:Bjorn Stroustrup教授本尊,发型很帅有木有三,大航海时代:如果说 simula 将编程界带入 面向对象 的青铜时代,C++ 直接开启了面向对象的大航海时代, 从此可以说各种语言是百花齐放,诸子争鸣, 各显神通。Delphi, Java, Python, Eiffel, Perl, C# 可是说都是在这波潮流中诞生的。尤其是 Java 语言,与C++ 相比较,去除了指针,多继承, 增加了垃圾回收机制,形成了一种特别干净且便于使用的语言,可以说彻底的降低了开发的门槛,你让一个老大爷过来都会写代码!!如果你说C++是蒸汽机的生产力, 那 Java 就是奔驰汽油发动机的生产力, 还可以加涡轮增压。 这个时候,可以说,整个世界都被 面向对象 统治了!图四: 面向对象大航海时代路线图三,失落的十年:从2010开始,面向对象的概念貌似开始跌落神坛。 随着互联网的病毒似的发展,很多公司对于并行计算的要求越来越高,而面向对象的特征,却并不能很好的适用于多核并行编程。在美国,很多大学已经不太注重学生对面向对象的理解了,引用rio的话:面向对象的核心是封装状态和相应的过程。通常面向对象是通过改变内部状态实现最终目的。调用对象过程的主要目的是产生改变其内部状态这个副作用(side effect)。这样封装的初衷是避免多个主体访问、修改同一状态造成混乱。在不少场合这样的封装确实也达到了目的,所以面向对象的方式才这么普及。但可变状态并不适合多核并行计算。如果多个并行进程需要用到同一状态,对这个状态的修改会导致一致性问题:由于访问、修改的先后顺序不同,各个进程也许会看到不同的结果。锁机制能部分的避免一致性问题,但并不解决多核并行的性能问题。不变状态则不存在这个问题,多个并行进程可以随意访问某个状态。因为状态是不变的,所以不存在一致性的问题。四,函数式编程的崛起:相比较面向对象编程,函数式编程的一个最大的好处就是不用维护状态,因为不用依赖外部的状态,也不会修改外部状态,让函数式编程在多核高并发的任务中显得得心应手。 说句大实话,就是相对于面向对象而言, 在解决多核高并发问题时,可以让你少操很多心。这貌似也是大势所驱吧。但是我仍然觉得没有一种剪刀可以剪断所有种类的绳子,无论是面向对象,还是面向过程,只要用的妥当,小米加步枪也能打出火箭炮的感觉!
桃酥萝莉
9楼 · 2022-08-22 17:01
继承、封装、多态,是面向对象最基本的原则。

相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问