類是資料型別,物件是記憶體的具體分配

2021-09-21 09:53:46 字數 2796 閱讀 3334

對於初學物件導向的人來說,往往很疑惑什麼是物件,什麼是類。在物件導向的程式設計領域中,我們需要明確乙個事實:所有的型別必須被明確的表示,而不是被其他資料型別來替代。

類是 c# 中功能最為強大的資料型別,它定義了資料型別的資料和行為。然後,程式設計師可以建立作為此類的例項的物件。類支援繼承,而繼承是物件導向程式設計的基礎部分。

比如我們在前面了解的乙個關於洗牌的過程,在前面的**中,我們計算和產生的不是真正意義上的撲克牌,而是字串!

如果要真正的描述撲克牌,我們必須要有乙個撲克牌的資料型別,而這個型別.net framework顯然沒有提供,因此我們需要自己編寫乙個撲克牌的型別。所以我們需要定義乙個撲克牌的型別,我們把自己定義的型別一般稱為類。

///

/// 撲克牌

///

public class poker

上述**描述我們使用關鍵字class定義了乙個類,該類的名字叫poker。這個類中定義了3個變數:style、title和value。

class 關鍵字前面是訪問級別。由於在該例中使用 public,因此任何人都可以基於該類建立物件。類的名稱位於 class 關鍵字的後面。定義的其餘部分是類的主體,用於定義行為和資料。類的字段、屬性、方法和事件統稱為「類成員」。

要使用這個類,我們需要對其實例化。所謂的例項化,說白了就是通知編譯器到記憶體中開闢乙個空間,以儲存一些值。通過使用 new 關鍵字(後跟物件將基於的類的名稱)可以建立物件:

poker pokera = new poker(); //例項化poker類

poker pokerk = new poker(); //例項化poker類

建立類的例項後,將向程式設計師傳遞歸對該物件的引用。在前面的示例中,pokera和pokerk是對基於 poker的物件的引用。此引用引用新物件,但不包含物件資料本身。

static void main(string args)

", pokera.style, pokera.title);

poker pokerk = new poker(); //例項化poker類

pokerk.style = ((char)4).tostring();

pokerk.title = "k";

pokerk.value = 13;

system.console.writeline("", pokerk.style, pokerk.title);

}我們得到的結果如圖3.3.1:

圖3.3.1

poker pokera = new poker()和poker pokerk = new poker()**用以產生乙個例項化poker物件。通俗的說就是,通知編譯器,我需要乙個新的空間,這個空間請按poker類的定義來分配空間,並且命名為pokera或pokerk。而style、title和value是poker類的值,儲存了poker具體的內容。

如果要比較兩張牌物件有兩種方案:

一、比較兩張牌物件是不是在同乙個記憶體空間,如果是的話,這兩個物件完全相等。

二、比較兩張牌物件的值是不是各自相等,如果是的話,表示這兩張牌的值或牌面一樣。

static void main(string args)

", pokera1.style, pokera1.title);

poker pokera2 = new poker(); //例項化poker類

pokera2.style = ((char)4).tostring();

pokera2.title = "a";

pokera2.value = 1;

system.console.writeline("", pokera2.style, pokera2.title);

system.console.writeline(pokera1 == pokera2); //在兩個記憶體空間中,兩個物件不相等

system.console.writeline(pokera1.value == pokera2.value);//兩張牌的值相等

}執行的結果如圖3.3.2:

圖3.3.2

初學者很不了解物件的相等和物件的值相等是什麼意思,用乙個通俗的場景來說,有兩個雙胞胎兄弟,長的是一模一樣,它們的衣服值一樣,它們的外觀值一樣,它們的所有的一切的值都一樣,但它們就是兩個人,而不能說是同乙個人。

而筆者名字叫「王豫翔」,在qq的暱稱上叫「熾天使」,msn叫「害羞的獅子王」,但其實都是同乙個人。

以下**描述了兩個物件相等,初學者要牢記,如果兩個物件相等,任意的物件改變的值,會影響另乙個物件的值,因為它們使用的是共同的記憶體。

static void main(string args)

", pokera1.style, pokera1.title);

poker pokera2 = new poker(); //例項化poker類

pokera2 = pokera1; //將pokera1的記憶體空間的位址賦值給pokera2

system.console.writeline(pokera1 == pokera2);

system.console.writeline(pokera1.value == pokera2.value);

pokera2.style = ((char)5).tostring(); //pokera2改變了花色

system.console.writeline("", pokera1.style, pokera1.title); //pokera1的花色值也改變了

}觀察圖3.3.3結果,並理解物件的引用關係。

圖3.3.3

初學者注意

出現上述原因是應為c#的資料型別分為:值型別和引用型別。物件是引用型別。具體的細節在後面我們將逐步介紹,稍安毋躁。

mysql物件資料型別 MYSQL 的資料型別

mysql 資料型別 mysql中定義資料欄位的型別對你資料庫的優化是非常重要的。mysql支援多種型別,大致可以分為三類 數值 日期 時間和字串 字元 型別。數值型別 mysql支援所有標準sql數值資料型別。這些型別包括嚴格數值資料型別 integer smallint decimal和nume...

基本資料型別物件包裝類

基本資料型別物件包裝類 基本資料型別 引用資料型別 byte byte short short int integer long long float float double double char characher boolean boolean 基本資料型別物件包裝類最常見作用 就是用於基本...

基本資料型別物件包裝類

基本資料型別物件包裝類 byte byte short short int integer long long boolean boolean float float double double char charcter 基本資料型別物件包裝類的最常見作用 就是用於基本資料型別和字串之間的做轉換 ...