3 回答

TA貢獻2051條經(jīng)驗 獲得超10個贊
事實是,面向?qū)ο蟮木幊掏ǔㄟ^在開發(fā)的哲學(xué)方面與計算機的實際機械工作之間建立脫節(jié)而造成混亂。我將嘗試為您對比兩者:
OOP的基本概念是:類>>對象>>實例。
類別=藍圖。對象是基于“藍圖”(如房屋)構(gòu)建的實際事物。實例是對象的虛擬副本(而不是真實副本)。
“實例”的更多技術(shù)解釋是它是“內(nèi)存引用”或引用變量。這意味著“實例”是內(nèi)存中僅其中有一個對象的內(nèi)存地址。它處理的對象與實例被稱為“實例”的對象相同。如果您有一個對象的許多實例,您實際上只是在內(nèi)存中不同位置上有許多變量,而這些變量中都有相同的確切內(nèi)存地址-都是相同的確切對象的地址。盡管看起來好像可以在代碼中進行更改,但是您永遠無法“更改”實例。當(dāng)您“更改”實例時,您真正要做的就是直接更改原始對象。在電子上,處理器在更改原始對象的數(shù)據(jù)之前會先經(jīng)過內(nèi)存中的一個額外位置(參考變量/實例)。
過程是:處理器>>實例的內(nèi)存位置>>原始對象的內(nèi)存位置。
請注意,使用哪個實例都沒有關(guān)系-最終結(jié)果將始終相同。所有實例將繼續(xù)在其內(nèi)存位置(對象的內(nèi)存地址)中保留相同的確切信息,只有對象會更改。
類和對象之間的關(guān)系有些混亂,盡管從哲學(xué)上講它是最容易理解的(藍圖>>房子)。如果對象是保存在內(nèi)存中某處的實際數(shù)據(jù),那么“類”是什么?事實證明,從機械上講,該對象是該類的精確副本。因此,該類只是內(nèi)存中其他地方的另一個變量,它擁有與對象相同的確切信息。注意關(guān)系之間的區(qū)別:
對象是類的副本。實例是保存對象的內(nèi)存地址的變量。
您還可以具有相同類的多個對象,然后每個對象具有多個實例。在這些情況下,每個對象的實例集的值相等,但是對象之間的實例不相等。例如:
讓A類從A類讓Object1,Object2和Object3。
// Object1具有與object2和object3相同的精確值,但是它們在內(nèi)存中的位置不同。
來自O(shè)bject1 >>讓obj1_Instance1,obj1_Instace2,obj1_Instance3
//所有這些實例的值也相等,并且在內(nèi)存中的不同位置。它們的值= Object1.MemoryAddress。
等等
當(dāng)您開始引入類型時,事情會變得更加混亂。這是一個使用c#類型的示例:
//假定類Person存在Person john = new Person();
實際上,如果將代碼分為兩部分,則更易于分析:
Person john;
john = new Person();
用技術(shù)術(shù)語來說,第一行“聲明了一個類型變量人。但是,這是什么意思??一般的解釋是,我現(xiàn)在有一個只能容納一個Person對象的空變量。但是請稍等-它是一個空變量!該變量的存儲位置中沒有任何內(nèi)容。事實證明,“類型”在機械上是沒有意義的。類型最初是作為管理數(shù)據(jù)的一種方式發(fā)明的。即使您聲明基本類型,例如int,str,chr(無需初始化),計算機內(nèi)也不會發(fā)生任何事情。程序設(shè)計的這種奇怪的語法方面是使人們認(rèn)識到類是對象的藍圖的一部分。OOP對帶有委托類型,事件處理程序等的類型變得更加困惑。我不會嘗試過多地關(guān)注它們,而只是記住它們都是用詞不當(dāng)。
第二行也有點混亂,因為它一次執(zhí)行兩項操作:
首先評估右側(cè)的“ new Person()”。它創(chuàng)建了Person類的新副本-即,它創(chuàng)建了一個新對象。
然后在左側(cè)評估“ john =“”。它將john變成一個引用變量,為它提供剛在同一行右側(cè)創(chuàng)建的對象的內(nèi)存地址。
如果您想成為一名優(yōu)秀的開發(fā)人員,那么一定要理解,沒有任何計算機環(huán)境能夠基于哲學(xué)理想而工作,這一點很重要。計算機甚至沒有那么邏輯-它們實際上只是一大堆電線,這些電線使用基本的布爾電路(主要是NAND和OR)粘合在一起。
添加回答
舉報