小菜同學(xué)拿到這個(gè)題,奮書疾筆,馬上寫出如下代碼:
ArrayList list = new ArrayList(); ? string stuNo1="10001"; string name1 = "張三"; string sex="男"; Datetime birthday1 = Datetime.Parse("1998-08-08"); string idCard1 = "362530199808080510"; list.add(stuNo1); list.add(name1); ... list.add.... ........//經(jīng)過1個(gè)半小時(shí)后,終于到了第40位。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-464362.html
那如果是有4000,4萬?你是不是立馬從入門到卸載了?面向?qū)ο髞砀嬖V你解決方案?。?/strong>
1. 面向?qū)ο蟾拍?/h2>
面向?qū)ο缶幊蹋?OOP,Object Oriented Programming
)
-
并不是一個(gè)技術(shù),而是一種編程指導(dǎo)思想。
-
把現(xiàn)實(shí)世界的具體事物全部看成一個(gè)一個(gè)的對象來解決實(shí)際問題。
為什么要用面向?qū)ο缶幊?/strong>
生活中我們解決問題就是按照對象化的方式進(jìn)行的。如果程序也能夠按照生活的中的方式來解
決問題,那么程序就更符合人類的思維習(xí)慣,代碼看起來會更易理解、更簡單、更易維護(hù)。
?
面向?qū)ο缶幊坦餐筇匦裕悍庋b,繼承,多態(tài)。
在C# 中,一定要時(shí)刻的牢記這句話:一切皆為object(對象);
2. 封裝
封裝 被定義為"把一個(gè)或多個(gè)項(xiàng)目封閉在一個(gè)物理的或者邏輯的包中"。在面向?qū)ο蟪绦蛟O(shè)計(jì)方法論中,封裝是為了防止對實(shí)現(xiàn)細(xì)節(jié)的訪問。
抽象和封裝是面向?qū)ο蟪绦蛟O(shè)計(jì)的相關(guān)特性。抽象允許相關(guān)信息可視化,封裝則使開發(fā)者實(shí)現(xiàn)所需級別的抽象。
訪問修飾符
C# 封裝根據(jù)具體的需要,設(shè)置使用者的訪問權(quán)限,并通過 訪問修飾符 來實(shí)現(xiàn)。
一個(gè) 訪問修飾符 定義了一個(gè)類成員的范圍和可見性。C# 支持的訪問修飾符如下所示:
-
public:所有對象都可以訪問;
-
private:對象本身在對象內(nèi)部可以訪問;
-
protected:只有該類對象及其子類對象可以訪問
-
internal:同一個(gè)程序集的對象可以訪問;
-
protected internal:訪問限于當(dāng)前程序集或派生自包含類的類型。
實(shí)現(xiàn)封裝的方式共有三種:類的封裝,屬性封裝,方法的封裝。
封裝的作用:
-
隱藏細(xì)節(jié),設(shè)置訪問權(quán)限,提高安全性
-
代碼復(fù)用。
-
提高代碼的可讀性
3. 什么是類
類是一組具有相同事物和行為的抽象(物以類聚)。
類在實(shí)現(xiàn)生活中是不存在的,看不見,摸不著。例如:人類,狗類,貓科類,靈長類.... 這些事物都只是一些抽象的概念,并不是指具體的物體。如果我說:小明今天吃了三碗飯,小紅的頭發(fā)很長,那么,小明,小紅 是指人類的具體對象,lucky(一只貓) 這個(gè)月身體長得很快,這也指的是對象,因?yàn)閘ucky是實(shí)實(shí)在在存在的。
人為什么不和狗分為一類?
答:因?yàn)槿撕凸返捏w征行為都不一樣??!再次強(qiáng)調(diào)類:類是一組具有相同事物和行為的抽象(物以類聚)。人會思考,人會制作工具,而狗不會。
?
對象:是真實(shí)存在的具體實(shí)例。
類(設(shè)計(jì)圖):是對象共同特征的描述(抽象)。
?
在C#中,必須先設(shè)計(jì)類,才能獲得對象。
?
4. 如何定義類
定義類的關(guān)鍵字是class,命名規(guī)范為首字母大寫,以帕斯卡(大駝峰)方式命名 如:
<訪問修飾符> class 類名 { // 構(gòu)造器(下一個(gè)單元會講到) // 字段 // 屬性(特征) // 方法(行為) // 事件(C# 高級階段學(xué)習(xí)) // 索引器(c# 高級階段學(xué)習(xí)) }
如:
public class Person { // 字段 private string name; // 屬性 public string Name { get { return name; } set { value=name; } } // 方法 public void eat() { Console.WriteLine("吃飯,我要吃油燜大蝦"); } }
?
其中,字段,屬性,方法,被統(tǒng)稱為類的成員。字段,屬性 被稱為成員變量,方法被稱為成員方法。
訪問標(biāo)識符 <access specifier> 指定了對類及其成員的訪問規(guī)則。如果沒有指定,則使用默認(rèn)的訪問標(biāo)識符。類的默認(rèn)訪問標(biāo)識符是 internal,成員的默認(rèn)訪問標(biāo)識符是 private。
5. 字段與屬性
字段一般是私有的(private),屬于類的私有信息,如:姓名,年齡,身份證號等等信息都是屬于人類的私有信息。
public class Person { private string name; private int age; }
?
屬性是類對外提供訪問字段的途徑,一般是公有的(public) ,如:別人問你年齡,女孩子一般說18歲。此時(shí)她說的18歲是她自己對外主動(dòng)暴露出來的,事實(shí)上她的真實(shí)年齡信息是私有的,只有她自己知道,到底是不是18歲我們其實(shí)是不清楚的。
public class Person { private string name; private int age; public string Name { // get 訪問器 get { return name; } // set 訪問器 set { value=name; } } public int Age { get { return 18; } set { value = age; } } }
Get, Set 訪問器都可以設(shè)置訪問修飾符哦,默認(rèn)的訪問修飾符都是public.
c# 9.0 之后 還支持
Init
訪問器, 調(diào)用方可使用屬性初始化表達(dá)式語法 , 在創(chuàng)建表達(dá)式中設(shè)置這些值 。 但構(gòu)造完成后,這些屬性將變?yōu)橹蛔x
?
字段與屬性的區(qū)別
-
字段是私有的(private),屬性是公開的(public)。
-
屬性具有讀寫器( get, set)
-
字段命名,以小駝峰命名,屬性以帕斯卡(大駝峰)命名。
-
屬性并沒有真正存儲數(shù)據(jù)
只讀屬性
也就是只提供了, Get 訪問器,沒有Set 訪問器。
public class Person { private short orderState public string OrderState { get { switch(orderState){ case 1: return "待支付"; case 2: return "待發(fā)貨"; case 3: return "待收貨"; case 4: return "已完成"; default: return "待支付"; } } } }
?
只寫屬性
也就是只提供了, Set 訪問器,沒有Get 訪問
public class Person { private string pwd public string Password { set { value = pwd;} // 沒有Get } }
?
屬性簡寫
如果一個(gè)類中,屬性只是直接對字段進(jìn)行讀寫,那么,這個(gè)屬性字段就可進(jìn)行簡寫。
例如:
public class Person { private string name; private int age; public string Name { get { return name; } set { value=name; } } public int Age { get { return 18; } set { value = age; } } } // 簡化后 public class Person { public string Name {get; set;} public int Age {get; set;} }
?
我們剛說過,屬性是對字段的封裝,但是簡寫后的屬性根本就看不到類,豈不是自相矛盾嗎?其實(shí)簡寫屬性中其實(shí)隱藏了字段,如果通過反編譯工具編譯 MS IL 或者通過反射技術(shù)去查看,我們會可以將它隱藏的字段讀取出來。
6. 類的對象(實(shí)例)
語法:
類名 對象名 = new 類名(); 如: Person per = new Person();
使用對象
訪問屬性: 對象名.成員屬性 訪問行為: 對象名.方法名(…)
?
例如:
public class Person { private string name public string Name { set { value = name;} get { return name;} } public void Eat() { Console.WriteLine($"姓名:{name},他正在吃飯.."); } } class Program { static void Main(string[] args) { Person per1 = new Person(); per1.Name = "張三"; // 訪問屬性 per1.Eat(); // 調(diào)用成員方法 Person per2 = new Person(); per2.Name = "李四"; // 訪問屬性 per2.Eat(); // 調(diào)用成員方法 } }
輸出結(jié)果:
姓名:張三,他正在吃飯.. 姓名:李四,他正在吃飯..
7. 構(gòu)造方法
學(xué)構(gòu)造方法的目的?
-
真正知道對象具體是通過什么得到的。
-
能夠掌握為對象賦值的其他寫法。
構(gòu)造方法的作用
-
用于初始化一個(gè)類的對象,并返回對象的地址。
-
簡化對象初始化的過程
語法
修飾符 類名(形參列表) { ... } public class Car { ... // 無參數(shù)構(gòu)造器 public Car() { ... } // 有參數(shù)構(gòu)造器 public Car(String n, String b) { ... } }
初始化對象的格式
類名 對象名稱 = new 構(gòu)造器; Car c = new Car();
構(gòu)造器的分類
-
無參數(shù)構(gòu)造器(默認(rèn)存在的):初始化的對象時(shí),成員變量的數(shù)據(jù)均采用默認(rèn)值。
-
有參數(shù)構(gòu)造器:在初始化對象的時(shí)候,同時(shí)可以為對象進(jìn)行賦值。
注意事項(xiàng)
-
任何類定義出來,默認(rèn)就自帶了無參數(shù)構(gòu)造器,寫不寫都有。
-
一旦定義了有參數(shù)構(gòu)造器,無參數(shù)構(gòu)造器就沒有了,此時(shí)就需要自己寫一個(gè)無參數(shù)構(gòu)造器了。
public class Car { ... // 無參數(shù)構(gòu)造器(默認(rèn)存在的) } public class Car { ... public Car() { // 無參數(shù)構(gòu)造器(需要寫出來了) } public Car(String n, String b) { // 有參數(shù)構(gòu)造器 } }
?
8. 兩個(gè)變量指向同一個(gè)對象
class Student { public string Name { get; set; } public string Sex { get; set; } public string Hobby { get; set; } public void Study() { Console.WriteLine($"姓名:{Name},性別:{Sex},愛好:{Hobby}"); } } public static void main(String[] args) { Student s1 = new Student(); s1.Name = "小明"; s1.Sex = '男'; s1.Hobby = "游戲、睡覺、聽課"; s1.Study(); // 把學(xué)生類型的s1變量賦值給學(xué)生類型的s2變量 Student s2 = s1; s2.Hobby = "愛提問"; Console.WriteLine(s2.Name); Console.WriteLine(s2.Sex); Console.WriteLine(s1.Hobby); s2.Study(); }
?
輸出結(jié)果:
姓名:小明,性別:男,愛好:游戲、睡覺、聽課 小明 男 愛提問 姓名:小明,性別:男,愛好:愛提問
內(nèi)存分布圖
思考:如果某個(gè)對象,被當(dāng)作方法參數(shù)傳遞之后,在方法體內(nèi)對象(形參)的某些屬性被修改,那么實(shí)參對象的屬性會發(fā)生變化嗎?
9. this 關(guān)鍵字
假設(shè)有如下一段代碼:
public class Person { private string name; private string age; public Person(string name,string age) { name = name; // 此處很有可能會有問題!! age = age; // 此處很有可能會有問題!! } }
?
編譯器很有可能分不清 name 到底是形參還是成員變量,怎么破? this 關(guān)鍵字就可以幫忙解決。
this關(guān)鍵字
-
this關(guān)鍵字可以出現(xiàn)在成員方法、構(gòu)造器中,代表當(dāng)前對象的地址。
-
作用:訪問當(dāng)前對象的成員變量、成員方法。
public class Person { private string name; private string age; public Person(string name,string age) { this.name = name; this.age = age; } }
10 . 作業(yè)
-
學(xué)生類:
-
字段:姓名,性別,成績,零錢
-
屬性:姓名:性別,成績( 只寫Set訪問器),成績等級(成績<60 -->差,60<= 成績<= 70 ---> 一般,70< 成績<=80 --->中,80<成績 <=90--->良, 其他---->優(yōu), 并且此屬性只讀),零錢
-
重載構(gòu)造方法,無參,有參(姓名,性別,成績,零錢)
-
-
學(xué)生類中定義Print 方法,將 姓名,性別,成績,零錢等級 輸出到控制臺。
-
在學(xué)生類中,定義
HelpShop()
方法,意思是 學(xué)生可以幫其他同學(xué)購物,然后自己獲得同學(xué)給的1元的傭金。偽代碼如下:public class Student { // ...字段 // ...屬性 /// <summary> /// 幫其他同學(xué)購物 /// <summary> /// <param name="s">被幫助的同學(xué)</param> /// <param name="money">購物所花費(fèi)的金額</param> public void HelpShop(Student s, decimal money) { } }
-
在Main方法中創(chuàng)建學(xué)生類對象,通過無參構(gòu)造方法創(chuàng)建
s1
對象,然后給 姓名,性別,成績,零錢 屬性賦值。 -
在Main方法中創(chuàng)建學(xué)生類對象,通過有參構(gòu)造方法創(chuàng)建
s2
對象 并初始化對象。 -
調(diào)用
s1, s2
Print方法,查看屬性值。 -
s1
調(diào)用HelpShop
方法, 將s2
作為參數(shù)傳遞進(jìn)去 -
再次調(diào)用Print 方法,查看
s1, s2
的屬性值的變化。
視頻教程:
C#入門到精通 - 網(wǎng)易云課堂 (163.com)文章來源:http://www.zghlxwxcb.cn/news/detail-464362.html
?
到了這里,關(guān)于第九單元 面向?qū)ο笠唬侯惻c對象的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!