對(duì)于初學(xué)面向?qū)ο蟮娜藖?lái)說(shuō),往往很疑惑什么是對(duì)象,什么是類。在面向?qū)ο蟮木幊填I(lǐng)域中,我們需要明確一個(gè)事實(shí):所有的類型必須被明確的表示,而不是被其他數(shù)據(jù)類型來(lái)替代。
類是 C# 中功能最為強(qiáng)大的數(shù)據(jù)類型,它定義了數(shù)據(jù)類型的數(shù)據(jù)和行為。然后,程序員可以創(chuàng)建作為此類的實(shí)例的對(duì)象。類支持繼承,而繼承是面向?qū)ο缶幊痰幕A(chǔ)部分。
比如我們?cè)谇懊媪私獾囊粋€(gè)關(guān)于洗牌的過(guò)程,在前面的代碼中,我們計(jì)算和產(chǎn)生的不是真正意義上的撲克牌,而是字符串!
如果要真正的描述撲克牌,我們必須要有一個(gè)撲克牌的數(shù)據(jù)類型,而這個(gè)類型.NET Framework顯然沒(méi)有提供,因此我們需要自己編寫(xiě)一個(gè)撲克牌的類型。所以我們需要定義一個(gè)撲克牌的類型,我們把自己定義的類型一般稱為類。
/// <summary>
/// 撲克牌
/// </summary>
public class Poker
{
/// <summary>
/// 撲克牌的花色
/// </summary>
public string Style;
/// <summary>
/// 撲克排的牌面
/// </summary>
public string Title;
/// <summary>
/// 撲克牌的值
/// </summary>
public int Value;
}
上述代碼描述我們使用關(guān)鍵字class定義了一個(gè)類,該類的名字叫Poker。這個(gè)類中定義了3個(gè)變量:Style、Title和Value。
class 關(guān)鍵字前面是訪問(wèn)級(jí)別。由于在該例中使用 public,因此任何人都可以基于該類創(chuàng)建對(duì)象。類的名稱位于 class 關(guān)鍵字的后面。定義的其余部分是類的主體,用于定義行為和數(shù)據(jù)。類的字段、屬性、方法和事件統(tǒng)稱為“類成員”。
要使用這個(gè)類,我們需要對(duì)其實(shí)例化。所謂的實(shí)例化,說(shuō)白了就是通知編譯器到內(nèi)存中開(kāi)辟一個(gè)空間,以存儲(chǔ)一些值。通過(guò)使用 new 關(guān)鍵字(后跟對(duì)象將基于的類的名稱)可以創(chuàng)建對(duì)象:
Poker pokerA = new Poker(); //實(shí)例化Poker類
Poker pokerK = new Poker(); //實(shí)例化Poker類
創(chuàng)建類的實(shí)例后,將向程序員傳遞回對(duì)該對(duì)象的引用。在前面的示例中,pokerA和pokerK是對(duì)基于 Poker的對(duì)象的引用。此引用引用新對(duì)象,但不包含對(duì)象數(shù)據(jù)本身。
static void Main(string[] args)
{
Poker pokerA = new Poker(); //實(shí)例化Poker類
pokerA.Style = ((char)4).ToString();
pokerA.Title = "A";
pokerA.Value = 1;
System.Console.WriteLine("{0}{1}", pokerA.Style, pokerA.Title);
Poker pokerK = new Poker(); //實(shí)例化Poker類
pokerK.Style = ((char)4).ToString();
pokerK.Title = "K";
pokerK.Value = 13;
System.Console.WriteLine("{0}{1}", pokerK.Style, pokerK.Title);
}
我們得到的結(jié)果如圖3.3.1:
圖3.3.1
Poker pokerA = new Poker()和Poker pokerK = new Poker()代碼用以產(chǎn)生一個(gè)實(shí)例化Poker對(duì)象。通俗的說(shuō)就是,通知編譯器,我需要一個(gè)新的空間,這個(gè)空間請(qǐng)按Poker類的定義來(lái)分配空間,并且命名為pokerA或pokerK。而Style、Title和Value是Poker類的值,存儲(chǔ)了Poker具體的內(nèi)容。
如果要比較兩張牌對(duì)象有兩種方案:
一、比較兩張牌對(duì)象是不是在同一個(gè)內(nèi)存空間,如果是的話,這兩個(gè)對(duì)象完全相等。
二、比較兩張牌對(duì)象的值是不是各自相等,如果是的話,表示這兩張牌的值或牌面一樣。
static void Main(string[] args)
{
Poker pokerA1 = new Poker(); //實(shí)例化Poker類
pokerA1.Style = ((char)4).ToString();
pokerA1.Title = "A";
pokerA1.Value = 1;
System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title);
Poker pokerA2 = new Poker(); //實(shí)例化Poker類
pokerA2.Style = ((char)4).ToString();
pokerA2.Title = "A";
pokerA2.Value = 1;
System.Console.WriteLine("{0}{1}", pokerA2.Style, pokerA2.Title);
System.Console.WriteLine(pokerA1 == pokerA2); //在兩個(gè)內(nèi)存空間中,兩個(gè)對(duì)象不相等
System.Console.WriteLine(pokerA1.Value == pokerA2.Value);// 兩張牌的值相等
}
運(yùn)行的結(jié)果如圖3.3.2:
圖3.3.2
初學(xué)者很不了解對(duì)象的相等和對(duì)象的值相等是什么意思,用一個(gè)通俗的場(chǎng)景來(lái)說(shuō),有兩個(gè)雙胞胎兄弟,長(zhǎng)的是一模一樣,它們的衣服值一樣,它們的外觀值一樣,它們的所有的一切的值都一樣,但它們就是兩個(gè)人,而不能說(shuō)是同一個(gè)人。
而筆者名字叫“王豫翔”,在QQ的昵稱上叫“熾天使”,MSN叫“害羞的獅子王”,但其實(shí)都是同一個(gè)人。
以下代碼描述了兩個(gè)對(duì)象相等,初學(xué)者要牢記,如果兩個(gè)對(duì)象相等,任意的對(duì)象改變的值,會(huì)影響另一個(gè)對(duì)象的值,因?yàn)樗鼈兪褂玫氖枪餐膬?nèi)存。
static void Main(string[] args)
{
Poker pokerA1 = new Poker(); //實(shí)例化Poker類
pokerA1.Style = ((char)4).ToString();
pokerA1.Title = "A";
pokerA1.Value = 1;
System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title);
Poker pokerA2 = new Poker(); //實(shí)例化Poker類
pokerA2 = pokerA1; //將pokerA1的內(nèi)存空間的地址賦值給pokerA2
System.Console.WriteLine(pokerA1 == pokerA2);
System.Console.WriteLine(pokerA1.Value == pokerA2.Value);
pokerA2.Style = ((char)5).ToString(); //pokerA2改變了花色
System.Console.WriteLine("{0}{1}", pokerA1.Style, pokerA1.Title); //pokerA1的花色值也改變了
}
觀察圖3.3.3結(jié)果,并理解對(duì)象的引用關(guān)系。
圖3.3.3
初學(xué)者注意
出現(xiàn)上述原因是應(yīng)為C#的數(shù)據(jù)類型分為:值類型和引用類型。對(duì)象是引用類型。具體的細(xì)節(jié)在后面我們將逐步介紹,稍安毋躁。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
