類有哪些基本特征及結(jié)構(gòu)體的區(qū)別
類有哪些基本特征及結(jié)構(gòu)體的區(qū)別
類是面向?qū)ο蟪绦蛟O(shè)計(jì)中的概念,是面向?qū)ο缶幊痰幕A(chǔ)。以下是學(xué)習(xí)啦小編為大家整理的類的基本特征,希望你們喜歡。
類的簡(jiǎn)介
類的實(shí)質(zhì)是一種數(shù)據(jù)類型,類似于int、char等基本類型,不同的是它是一種復(fù)雜的數(shù)據(jù)類型。因?yàn)樗谋举|(zhì)是類型,而不是數(shù)據(jù),所以不存在于內(nèi)存中,不能被直接操作,只有被實(shí)例化為對(duì)象時(shí),才會(huì)變得可操作。
類是對(duì)現(xiàn)實(shí)生活中一類具有共同特征的事物的抽象。如果一個(gè)程序里提供的類型與應(yīng)用中的概念有直接的對(duì)應(yīng),這個(gè)程序就會(huì)更容易理解,也更容易修改。一組經(jīng)過(guò)很好選擇的用戶定義的類會(huì)使程序更簡(jiǎn)潔。此外,它還能使各種形式的代碼分析更容易進(jìn)行。特別地,它還會(huì)使編譯器有可能檢查對(duì)象的非法使用。
類的內(nèi)部封裝了方法,用于操作自身的成員。類是對(duì)某種對(duì)象的定義,具有行為(be-havior),它描述一個(gè)對(duì)象能夠做什么以及做的方法(method),它們是可以對(duì)這個(gè)對(duì)象進(jìn)行操作的程序和過(guò)程。它包含有關(guān)對(duì)象行為方式的信息,包括它的名稱、實(shí)現(xiàn)操作的函數(shù)和實(shí)現(xiàn)屬性的數(shù)據(jù)。
類的構(gòu)成包括數(shù)據(jù)成員和成員函數(shù)。數(shù)據(jù)成員對(duì)應(yīng)類的屬性,類的數(shù)據(jù)成員也是一種數(shù)據(jù)類型,并不需要分配內(nèi)存。成員函數(shù)則用于操作類的各項(xiàng)屬性,是一個(gè)類具有的特有的操作,比如“學(xué)生”可以“上課”,而“水果”則不能。類和外界發(fā)生交互的操作稱為接口。
類的三大特性
封裝性
將數(shù)據(jù)和操作封裝為一個(gè)有機(jī)的整體,由于類中私有成員都是隱藏的,只向外部提供有限的接口,所以能夠保證內(nèi)部的高內(nèi)聚性和與外部的低耦合性。用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過(guò)外部接口,以特定的訪問(wèn)權(quán)限來(lái)使用類的成員,能夠增強(qiáng)安全性和簡(jiǎn)化編程。
繼承性
繼承性更符合認(rèn)知規(guī)律,使程序更易于理解,同時(shí)節(jié)省不必要的重復(fù)代碼。
多態(tài)性
同一操作作用于不同對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。在運(yùn)行時(shí),可以通過(guò)指向基類的指針,來(lái)調(diào)用實(shí)現(xiàn)派生類中的方法。
類與結(jié)構(gòu)體的區(qū)別
在C++、C#語(yǔ)言中,class和struct都可以定義一個(gè)類,它們的區(qū)別如下:
C#中,class是引用類型,繼承自System.Object類;struct是值類型,繼承自System.ValueType類,不具多態(tài)性。但是注意,System.ValueType是個(gè)引用類型。
從職能觀點(diǎn)來(lái)看,class表現(xiàn)為行為;而struct常用于存儲(chǔ)數(shù)據(jù)。
class支持繼承,可以繼承自類和接口;而struct沒(méi)有繼承性,struct不能從class繼承,也不能作為class的基類,但struct支持接口繼承。
class可以聲明無(wú)參構(gòu)造函數(shù),可以聲明析構(gòu)函數(shù);而struct只能聲明帶參數(shù)構(gòu)造函數(shù),且不能聲明析構(gòu)函數(shù)。因此,struct沒(méi)有自定義的默認(rèn)無(wú)參構(gòu)造函數(shù),默認(rèn)無(wú)參構(gòu)造器只是簡(jiǎn)單地把所有值初始化為它們的0等價(jià)值。
Java/C#中,實(shí)例化時(shí),class要使用new關(guān)鍵字;而struct可以不使用new關(guān)鍵字,如果不以new來(lái)實(shí)例化struct,則其所有的字段將處于未分配狀態(tài),直到所有字段完成初始化,否則引用未賦值的字段會(huì)導(dǎo)致編譯錯(cuò)誤。
class可以實(shí)現(xiàn)抽象類(abstract),可以聲明抽象函數(shù);而struct為抽象,也不能聲明抽象函數(shù)。
class可以聲明protected成員、virtual成員、sealed成員和override成員;而struct不可以,但是值得注意的是,struct可以重載System.Object的3個(gè)虛方法,Equals()、ToString()和 GetHashTable()。
class的對(duì)象復(fù)制分為淺拷貝和深拷貝,必須經(jīng)過(guò)特別的方法來(lái)完成復(fù)制;而struct創(chuàng)建的對(duì)象復(fù)制簡(jiǎn)單,可以直接以等號(hào)連接即可。
class實(shí)例由垃圾回收機(jī)制來(lái)保證內(nèi)存的回收處理;而struct變量使用完后立即自動(dòng)解除內(nèi)存分配。
作為參數(shù)傳遞時(shí),class變量是以按址方式傳遞;而struct變量是以按值方式傳遞的。
我們可以簡(jiǎn)單的理解,class是一個(gè)可以動(dòng)的機(jī)器,有行為,有多態(tài),有繼承;而struct就是個(gè)零件箱,組合了不同結(jié)構(gòu)的零件。其實(shí),class和struct最本質(zhì)的區(qū)別就在于class是引用類型,內(nèi)存分配于托管堆;而struct是值類型,內(nèi)存分配于線程的堆棧上。由此差異,導(dǎo)致了上述所有的不同點(diǎn)。所以只有深刻的理解內(nèi)存分配的相關(guān)內(nèi)容,才能更好的駕馭。
當(dāng)然,使用class基本可以替代struct的任何場(chǎng)合,class后來(lái)居上。雖然在某些方面struct有性能方面的優(yōu)勢(shì),但是在面向?qū)ο缶幊汤铮臼莄lass橫行的天下。
那么,有人不免會(huì)提出,既然class幾乎可以完全替代struct來(lái)實(shí)現(xiàn)所有的功能,那么struct還有存在的必要嗎?答案是,至少在以下情況下,鑒于性能上的考慮,我們應(yīng)該考慮使用struct來(lái)代替class:
實(shí)現(xiàn)一個(gè)主要用于存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)時(shí),可以考慮struct。
struct變量占有堆棧的空間,因此只適用于數(shù)據(jù)量相對(duì)小的場(chǎng)合。
struct數(shù)組具有更高的效率。
類的主要詞性變化
◎ 類 lèi 〈動(dòng)〉
(1)相似;像 [resemble;be similar to]
遂入,殺孟陽(yáng)于床。曰:"非君也,不類。"--《左傳·莊公八年》
不類前人。--《論衡·自紀(jì)》
益奇而堅(jiān),其疏數(shù)偃仰,類智者所施設(shè)也。--唐·柳宗元《小石城山記》
與張氏之吝書(shū)若不相類。-- 清·袁枚《黃生借書(shū)說(shuō)》
(2) 又
令黃生貧類予,其借書(shū)亦類予。
語(yǔ)類楚聲。-- 明·魏禧《大鐵椎傳》
絕類彌勒。--明·魏學(xué)洢《核舟記》
畫虎不成反類犬
(3) 類比;類推 [analogy;reason by]義不殺少而殺眾,不可謂知類。--《墨子》
(4) 又如:類推
(5) 通"戾"。偏,不平 [bias]
夫富貴者則類,傲之;夫貧賤者則求柔之;是非仁人之情也。--《荀子·不茍》
◎ 類 lèi 〈副〉
大抵;大都 [generally;in the main;mostly]
觀古今文人,類不護(hù)細(xì)行。--三國(guó) 魏·曹丕《與吳質(zhì)書(shū)》
走卒類士服。--宋· 司馬光《訓(xùn)儉示康》
看過(guò)“類的三大特性”的人還看了:
2.秋季種什么蔬菜