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)粘合在一起。
添加回答
舉報