为了账号安全,请及时绑定邮箱和手机立即绑定

对象和实例之间的区别

对象和实例之间的区别

开满天机 2019-11-05 15:25:56
我知道以前曾提出 过这样的问题,但是我仍然觉得答案太模糊了,以至于我(以及某些/大多数初学者)都难以理解。我一直在尝试自学比程序和基本OOP更广泛的编程概念。我了解OOP的具体概念(您创建一个具有数据(成员)和函数(方法)的类,然后在运行时实例化该类以实际执行此类操作。我认为我对类的含义有所了解(某种实例的设计蓝图,该实例在编译时以其相似性创建)。但是如果是这样,什么是物体?我也知道,在基于原型的语言中,这甚至可以使事情变得更糟,但这也许就是为什么在我的脑海中需要对对象和实例进行清楚的区分。除此之外,我还与“对象”和“实例”的概念作斗争。我阅读了很多资源(包括SO的答案),它们在很大程度上是相同的,并且在语义上有所不同。别人说这两者之间存在真正的概念差异。SO的专家可以帮助初学者拥有在OOP领域前进的“啊哈”时刻吗?再次感谢。注意:这不是家庭作业,我不上学-但是,我认为这会对寻求家庭作业帮助的人有所帮助。
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

房屋设计的蓝图就像一个班级描述。根据该蓝图建造的所有房屋均为该类别的对象。给定的房子是一个实例。


查看完整回答
反对 回复 2019-11-05
?
侃侃无极

TA贡献2051条经验 获得超10个赞

事实是,面向对象的编程通常会通过在开发的哲学方面与计算机的实际机械工作之间建立脱节而造成混乱。我将尝试为您对比两者:


OOP的基本概念是:类>>对象>>实例。


类别=蓝图。对象是基于“蓝图”(如房屋)构建的实际事物。实例是对象的虚拟副本(而不是真实副本)。


“实例”的更多技术解释是它是“内存引用”或引用变量。这意味着“实例”是内存中仅其中有一个对象的内存地址。它处理的对象与实例被称为“实例”的对象相同。如果您有一个对象的许多实例,您实际上只是在内存中不同位置上有许多变量,而这些变量中都有相同的确切内存地址-都是相同的确切对象的地址。尽管看起来好像可以在代码中进行更改,但是您永远无法“更改”实例。当您“更改”实例时,您真正要做的就是直接更改原始对象。在电子上,处理器在更改原始对象的数据之前会先经过内存中的一个额外位置(参考变量/实例)。


过程是:处理器>>实例的内存位置>>原始对象的内存位置。


请注意,使用哪个实例都没有关系-最终结果将始终相同。所有实例将继续在其内存位置(对象的内存地址)中保留相同的确切信息,只有对象会更改。


类和对象之间的关系有些混乱,尽管从哲学上讲它是最容易理解的(蓝图>>房子)。如果对象是保存在内存中某处的实际数据,那么“类”是什么?事实证明,从机械上讲,该对象是该类的精确副本。因此,该类只是内存中其他地方的另一个变量,它拥有与对象相同的确切信息。注意关系之间的区别:


对象是类的副本。实例是保存对象的内存地址的变量。


您还可以具有相同类的多个对象,然后每个对象具有多个实例。在这些情况下,每个对象的实例集的值相等,但是对象之间的实例不相等。例如:


让A类从A类让Object1,Object2和Object3。


// Object1具有与object2和object3相同的精确值,但是它们在内存中的位置不同。


来自Object1 >>让obj1_Instance1,obj1_Instace2,obj1_Instance3


//所有这些实例的值也相等,并且在内存中的不同位置。它们的值= Object1.MemoryAddress。


等等


当您开始引入类型时,事情会变得更加混乱。这是一个使用c#类型的示例:


//假定类Person存在Person john = new Person();


实际上,如果将代码分为两部分,则更易于分析:


Person john;

john = new Person();

用技术术语来说,第一行“声明了一个类型变量人。但是,这是什么意思??一般的解释是,我现在有一个只能容纳一个Person对象的空变量。但是请稍等-它是一个空变量!该变量的存储位置中没有任何内容。事实证明,“类型”在机械上是没有意义的。类型最初是作为管理数据的一种方式发明的。即使您声明基本类型,例如int,str,chr(无需初始化),计算机内也不会发生任何事情。程序设计的这种奇怪的语法方面是使人们认识到类是对象的蓝图的一部分。OOP对带有委托类型,事件处理程序等的类型变得更加困惑。我不会尝试过多地关注它们,而只是记住它们都是用词不当。


第二行也有点混乱,因为它一次执行两项操作:


首先评估右侧的“ new Person()”。它创建了Person类的新副本-即,它创建了一个新对象。


然后在左侧评估“ john =“”。它将john变成一个引用变量,为它提供刚在同一行右侧创建的对象的内存地址。


如果您想成为一名优秀的开发人员,那么一定要理解,没有任何计算机环境能够基于哲学理想而工作,这一点很重要。计算机甚至没有那么逻辑-它们实际上只是一大堆电线,这些电线使用基本的布尔电路(主要是NAND和OR)粘合在一起。


查看完整回答
反对 回复 2019-11-05
  • 3 回答
  • 0 关注
  • 888 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信