3 回答
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)粘合在一起。
添加回答
举报