亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對象和實例之間的區別

對象和實例之間的區別

開滿天機 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 關注
  • 1032 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號