??? 學習過了C#的基本屬性函數后,接下來的學習我覺得比較重要。C#是一種面向對象的語言,下面復習一下面向對象中的一些名詞。 ??? 類:把一些系列東西,把他們的共同的屬性和方法抽象出來,給他起一個名字就是XXX類。類中定義的靜態的就是屬性 ,動態的方法就是功能?。
??? 對象:凡是能夠看得見摸得著的東西就是對象,說白了就是某個類里面的一個具體的東西(成員)。在現實生活中是先有對象再有類的,萬物皆對象。。但是在程序里是先有類再有對象的。C#是面向對象編程的,在程序中,一切運行的基本單位都是對象。類的定義格式:[訪問修飾符] class 類名 {//類體? } 在程序里面有且只能有一類包含Main方法,這個類稱之為主類。 ???
?? int,byte,long都是一個數據類型---整數類型,class也是一個數據類型--類類型,interface是一個數據類型但他是接口類型。本身類就是一個數據類型---類類型,有這個類定義的對象是這個類型的變量。?? ???
?? ?創建對象過程是:就是把類里面所有的東西賦值一份,放到對象的內存空間中。那么對象方式屬性和方法是自己內存空間中的。一個類可以創建n個對象,那么n個對象之間是沒有任何的關系,唯一是他們產生于一個類。 類創建對象的格式如:
???????????????????? ?類名 對象名 = new 類名(); ????
類中的屬性是對成員變量的一個封裝,使得這個變量具有了讀和寫的權利。一般情況下,成員變量是私有類型,只能在類的內部使用。一般情況,屬性都是用public來修飾。如果在類的外面使用,則應該把成員變量封裝成屬性。格式如下: ???
?????? ?public 類型 屬性名 ???
?????? ?{ ?get{return 成員變量;} ?
?????????? set{成員變量=value;}
??????? }? ??
訪問修飾符一般有public和private,其中public:共有的,在哪里都能夠用的方法;private:私有的,只能在類的內部使用,也就是對象的內存空間中使用。由private定義的變量和方法,對象不能夠直接對其調用。但是可以通過間接來訪問。 ???
?????? 注意:以后我們所說的對象,成員和實例都代表一個意思,也就是 對象===成員===實例,從而可知:成員的變量=實例的變量=對象的變量,不難知道成員方法=成員函數=成員功能,成員方法的書寫格式如下: ???
???????????? [訪問修飾符] 返回值 函數名(參數列表) { } ???
??? 構造函數是用來創建對象的。構造函數開辟出一個內存空間,這個空間放在堆里面。此時,對象就指向了這個內存空間,然后類里面的東西復制到這個空間中。構造函數是一個特殊的函數,沒有返回值,構造函數名必須和類名一樣。構造函數除了用來創建對象之外,還起到以下作用:初始化成員變量,使對象的多元化。默認情況下,系統會為類提供一個空的構造函數:public 類名(){}。一旦為類增加了構造函數,那么系統就不會為這個類添加一個默認的構造函數。一般情況下他的書寫格式如下:[訪問修飾符] 類名(構造函數名)(參數列表){? }? ????
??????? 建議:無論在什么情況下,必須顯示定義一個空的構造函數。 ????
????函數重載指得是函數可以具有相同的方法名,但是參數的類型,個數,順序不一樣的函數互為函數的重載。函數的重載是因為功能一樣,但是處理的內容和方式不一樣。函數的重載前提條件是函數必須在同一個類里面。 ????
?? ?this關鍵字,this指的就是當前對象。使用this關鍵字可以使得參數見名知意,同時起到了成員變量和參數之間的區別。值得注意的是this關鍵字是多態的。 ???
?? static關鍵字,通過static關鍵字修飾方法,變量,屬性都是屬于類的。只能通過類來調用,不能通過對象來訪問。凡是通過static關鍵字修飾的方法,只能夠調用有static修飾的方法和變量。但是不能夠直接調用成員的變量和方法。那么成員的方法可以直接的調用Static修飾的方法和變量。建議直接通過類名來訪問Static修飾的變量和方法。static修飾的變量和方法在內存中只創建一次。直到程序退出,才會消失。也就是說是誰的誰調用。 ??
?????? C#的一些新特性: ??????
????? 1,屬性:可以直接寫屬性,而不需要成員變量,get和set也不需要實現。 ??????
2,創建對象:在創建對象的時候,可以直接給屬性賦值。如: People p = new People(){Name="",Age=90}; ??????
3,通過var關鍵字來標示任何類型的變量,但是不是說就是若類型語言, 但是,Var定義的變量只能夠在方法里面使用。。如: var s = "sss"; ?????? var p = new People(); ???
????? 4,匿名對象:可以通過new 關鍵字來創建一個匿名對象,這個對象沒有類型。屬性可以隨意定義。注意,匿名對象只能通過Var關鍵字定義的變量來接受。 ?????
???? C#的繼承:繼承是用來擴展自身的功能。通過關鍵符號“:”來實現繼承,以下這些名詞意思都是相等的 父類=基類=超類=base class;子類=sub類=派生類。繼承中的構造函數,默認情況下,子類中的構造函數調用的是父類的空的構造函數。如果父類中沒有空的構造函數,那么子類的構造函數必須顯示的調用父類中的某一個構造函數。 ????
??? ?base關鍵:base指得是父類對象。如果base放在子類構造函數后,則base調用的是父類的構造函數。如果base在普通方法中,則指的是創建的父類對象,可以調用父類對象中的方法和屬性。 ???
?? 方法的重寫:由于父類的方法不能夠完成某種功能,單還必須調用這個方法,則子類可以重寫這個方法,加強其功能。在父類里面,如果一個函數可以讓子類重寫,必須在在方法的前面用vritual關鍵來修飾。說明這個方法可以被子類重寫。同理如果在子類里面,要重寫父類的方法,則應在方法前面加上override關鍵字,說明這個方法是重寫父類的。重寫方法的要求是必須有繼承,重寫的方法和被重寫的方法必須一模一樣。 ???
??? 多態是一個事物可以同時具有多種較色,但是在某一種特殊的場合只表現出一中。其中比較重要的兩種轉型得需要我們深入的理解一下,我就是在這方面對多態有些概念的模糊,不過通過老師的深入解析漸漸的也就參透了其中的意思。 ????
? (1),上轉型: 把子類對象賦值給父類對象,稱之為上轉型。他的原理:實際上是把子類對象中的父類對象賦值了父類,此時的賦值語句兩邊的類型是相同的。此時,這個父類對象能夠調用的方法是:自己的方法和已經重寫過的方法,如果方法沒有被子類重寫,那么調用的還是自己的方法。他的用途是方便同一標準,根據具體實現不同,而調用不同的方法,從而實現不同的功能和樣式。
如: WuDang w = new People(); ?????
?????? w.sing();//已經重寫的方法。 ???????????
w.print();//print沒有重寫的方法
????
? (2),下轉型:把已經上轉型的父類對象賦值給子類對象。他的原理:就是把已經上轉型后的父類對象所對應的原來的子類對象在賦值給子類對象。此時,這個對象能夠調用的方法是自身的方法,繼承來得方法和已經重寫過得方法。 注意,下轉型需要通過顯示的類型轉換。如:People pp = (People) w; ????
?? 注意:C#中只支持單繼承,一個類只能有一個直接的父類。 ??? 抽象類是類的一種特殊類,他沒有構造函數不可以創建對象。他的書寫格式如: ?????????????
??????? ?[訪問修飾符] abstract class 類名
{ //擁有了普通類出構造函數外的任何東西 ??
//還可以有抽象函數 ??????????????
} ????
??? sealed關鍵字:如果sealed修飾的是類,則這個類是無法被繼承,不能當父類;如果sealed修飾方法,則子類是無法重寫這個方法的。 ????
??? interface接口是為了解決多繼承的問題而誕生的一種特殊的“類”,接口里面只能寫方法的定義和屬性的定義。在接口中的方法定義前面不能含有public,子類在實現接口的方法是,不能使用override關鍵字。他的書寫格式如: ?????
? pubilc interface 接口名?{?}?? ????
注意:如果一個類同時要繼承類也要實現結構,那么父類要寫在前面,接口在后。 ????
?? ?protected關鍵字:由protected關鍵字修飾的變量和方法只能在本類和子類中去使用,不能通過對象來訪問。 ????
?? ?namespace命名空間是為了解決重名的問題,方便管理類而產生的,命名空間只能夠放,類,接口,枚舉,結構體,委托 而不能有方法,變量的。命名空間是可以嵌套的,命名空間于物理路徑沒有關系,只和邏輯上有關系。他的書寫格式如:
namespace 名字{? }??? ???
??? enum枚舉:把有限的元素放在一起。使用字母代替數字標示的含義。枚舉是一個值類型。
下面是一個很容易理解的繼承例子,他幫助我很明了的理解C#的繼承關系:
using System; public class StudyExtend1 {public static void Main(){People p = new People("ss");p.Test();p.TaiJi();
} } public class WuDang {private string name;public WuDang(){}public WuDang(string name){Console.WriteLine("I'm First!");}public WuDang(int age){Console.WriteLine("I'm First!");}public WuDang(string name,int age){}public string Name{get{return this.name;}set{this.name = value;}}public void Taiji(){Console.WriteLine(this.name);Console.WriteLine(this.GetType());} } //People繼承了武當 public class People : WuDang {public People(string name):base("ss",67){Console.WriteLine("I'm Second!");}public void Test(){base.Taiji();base.Name ="ss";}}
?
?
?
?
?
?
?
?
?
?
?
?
?