-
1、泛型類就是一個模子,放入類型的材料(字段屬性方法),可以塑造出想要的產(chǎn)品。
2、語法
class Cage<T>//這是一個籠子類和泛型類,類名后加上一對<>,加上一個泛型參數(shù)
{
T[] petArray;//定義T類型的數(shù)組
public void PutIn(T pet){···}//放入T類型的寵物
public T TakeOut(int index){···}//占位符T,cage類變?yōu)榫唧w類時,T相應(yīng)的變成具體數(shù)
}
//實例化
var dogCage=new Cage<Dog>();//得到狗狗籠子
var catCage=new Cage<Cat>();//得到貓咪籠子
3、為什么需要泛型,用基類(包括所有類的基類object)或者公共的接口也可以實現(xiàn)一個Cage類,但是類型太寬泛,需要顯示轉(zhuǎn)換類型并判斷真是類型是什么。
4、泛型使用:聲明一個泛型類->引用泛型->構(gòu)造實例
class Cage<t>{···}
class Cage<Dog>{···}
dogCage=new Cage<Dog>;
比如不寫Petcage<Dog> dog=new Petcage<Dog> ("名字");而用一個從來沒見過的 var代替。還有 return default<T>也沒解釋啥意思
理解:泛型就是在不確定類的參數(shù)類型和返回類型時,設(shè)置一個變量來代替這個固定的類型。當創(chuàng)建類實例時,在給這個變量賦對應(yīng)類類型值,這樣就可以實現(xiàn)一個類,輸出不同類型的值和方法。
不用老師的例子,用一個給數(shù)組賦值輸出數(shù)組的例子更好理解;如設(shè)置一個類,構(gòu)造函數(shù)初始化一個數(shù)組數(shù)組類型為int,有給數(shù)組賦值方法和獲取數(shù)組值的方法,在此注意:數(shù)組的類型int和獲取數(shù)組值的方法的返回值類型都為int,如果實例此類調(diào)用方法,實參和返回值類型也必須是int;就此限定死了此類的實例; 如果想要一個設(shè)置char類型的實例,還得必須創(chuàng)建一個新的char的類和方法才能實現(xiàn);這樣代碼工作量很大;若使用泛型,用變量<T>代替固定類型int或char,這樣在實例化的時候,將T賦不同類型(int、double、char)就可以獲得想要的返回值類型,從而實現(xiàn)了一個模板,只變一個參數(shù)T就能實現(xiàn)相同的功能
上面給出的例子。只需要把所有<T>去掉,后面的T全改為int或char 就能變?yōu)槠胀惲恕Ρ壤斫夥浅:唵瘟?/p>查看全部 -
1、什么是重載運算符
不能創(chuàng)造新的運算符,所以利用現(xiàn)有的某種運算符,針對自定義類或者結(jié)構(gòu)(預(yù)定義類型和現(xiàn)有運算符的運算含義是確定的所有不能更改),定義某種運算符(該運算符和該操作具有一定相關(guān)性,如公狗狗+母狗狗=新生狗狗),從而簡化自定義類型的操作。
為什么需要重載運算符:利用現(xiàn)有運算符,簡化自定義類型的操作。最好是,該運算符和該操作,具有一定億相關(guān)性。
2、語法細節(jié)
public static Dog operator +(Dog male,Dog female)//如公狗狗+母狗狗=新生狗狗
{
···
}
3、哪些運算符可以重載
一元運算符:+、-、!、~、++、- -、true、false(操作數(shù)必須是類和結(jié)構(gòu))
二元運算符:+、-、*、%、&、|!、^、<<、>>、= =、!=、>、<、>=、<=(兩個操作數(shù)至少有一個表示類或者結(jié)構(gòu))
不能重載:=、&&、||、[](索引操作)、()等
4、重載運算符不能做什么
創(chuàng)造新運算符
改變運算符語法
重定義運算符如何處理預(yù)定義類型
改變運算符的優(yōu)先級和結(jié)合性
5、重在運算符舉例
···
public void ShowAge()
{
Console.WriteLine("Age="+_age);
}
···
//重載自增操作,針對寵物的年齡
public static Pet opertor ++(Pet pet)//返回值為Pet類型,參數(shù)為寵物自身。所有的重載方法都需要public static修飾
{
++pet._age;
return pet;
}
···
Dog dog=new Dog("Jack");
dog._age=2;
dog++;
dog.ShowAge();查看全部 -
隱式轉(zhuǎn)換語法public static implicit opertor Dog()(Cat cat){retuen new Cat(Dog dog);}
顯示轉(zhuǎn)換語法public static explicit operator Dog(Cat cat){...}
查看全部 -
1、裝箱:根據(jù)值類型的值,在堆上創(chuàng)建一個完整的引用類型對象,并返回對象的引用,是一種隱式轉(zhuǎn)換(語言自動完成)。
2、為什么要裝箱
有時候需要將值類型轉(zhuǎn)化為引用類型(比如object)來進行統(tǒng)一的操作(比如作為函數(shù)的參數(shù))和統(tǒng)一的存儲(比如object[])。
3、裝箱簡單實例
int i=3;
object oi=null;
oi=i;//發(fā)生裝箱,原來的int保持不變,創(chuàng)建了一個新的對象,該對象在堆當中。需要性能消耗的。
4、裝箱的本質(zhì)
就是在對上創(chuàng)建了一個引用類型的副本,新創(chuàng)建的引用類型和原來的值類型相互獨立。
相互獨立代碼驗證:
int i=3;
object oi=i;//發(fā)生裝箱
Console.WriteLine("i="+i+",oi="+oi.ToString);//輸出為i=3,oi=3
oi=10;
i=7;
Console.WriteLine("i="+i+",oi="+oi.ToString);//輸出為i=7,oi=10, oi存儲在堆中, i存儲在棧中
說明兩者相互獨立
5、拆箱
將裝箱后的對象轉(zhuǎn)化回值類型的過程,是一種顯示轉(zhuǎn)換(需要手動干預(yù))。
6、拆箱實例
in i=3;
object oi=i;//裝箱
int j=(int)oi;//拆箱 通過強制轉(zhuǎn)換Console.WriteLine("j="+j);//輸出10
查看全部 -
1、靜態(tài)類
包含靜態(tài)屬性和方法,被標記為static
靜態(tài)類不能創(chuàng)建實例,不能被繼承。
可以為靜態(tài)類定義靜態(tài)構(gòu)造函數(shù)。
2、作用
主要用于基礎(chǔ)類庫(math類)和擴展方法。
3、如何擴展方法
若有源代碼,直接添加一個新方法
如果不能修改單也不是密閉類,可以派生子類擴展
如果以上條件不滿足,可以使用靜態(tài)類擴展方法
3、在靜態(tài)類中的靜態(tài)方法中參數(shù)中加入this關(guān)鍵,則可以直接利用對象調(diào)用方法就可以。static class PetGuide//擴展Dog類的方法
{?public?static double HowToFreedDog(this Dog dog){...}
{
Console.WriteLine("播放如何喂養(yǎng)一直狗狗的視頻");
}
}Dog dog=new Dog("Tommy");
dog.HowToFreedDog();
4、總結(jié)擴展要求
擴展方法所屬的類,必須是static類
擴展方法本身就是static方法
擴展方法的第一個參數(shù)類型,必須是this+類名。
例如:
Dog類沒辦法修改,修改Dog類就需要擴展方法,需要一個喂養(yǎng)寵物的方法
static class PetGuide//擴展Dog類的方法
{static public void HowToFreedDog(this Dog dog)
{
Console.WriteLine("播放如何喂養(yǎng)一直狗狗的視頻");
}
}
···
Dog dog=new Dog();//Dog類中沒有HowToFreedDog();方法
dog.HowToFreedDog();//擴展之后好像Dog類中有這樣的方法一樣。查看全部 -
靜態(tài)類和靜態(tài)成員
1、類的靜態(tài)成員
成員被標記為static時,就是靜態(tài)成員。靜態(tài)成員將會被類的所有實例共享,所有實例都訪問統(tǒng)一內(nèi)存位置。
靜態(tài)成員跟實例成員分開存放。靜態(tài)成員存放在堆中。class Dog{static int Num;}2、靜態(tài)成員訪問
直接通過類名訪問,普通成員需要通過實例訪問。3、靜態(tài)成員聲明周期
獨立任何實例,沒有實例也可以訪問。靜態(tài)成員使用之前編譯器已經(jīng)幫忙完成初始化。
4、靜態(tài)函數(shù)不能訪問實例成員,僅能訪問其他靜態(tài)成員,普通方法可以訪問靜態(tài)成員
5、靜態(tài)構(gòu)造函數(shù)class Dog{static public void PrintNum(){Console.WriteLine(“Num=”+Num);}}用于初始化靜態(tài)字段
在引用任何靜態(tài)成員之前,和創(chuàng)建任何實例之前調(diào)用。
與類同名,使用static,無參數(shù),沒有訪問修飾符,普通構(gòu)造函數(shù)可以重載的.
靜態(tài)函數(shù)只能訪問靜態(tài)成員,非靜態(tài)函數(shù)可以訪問靜態(tài)/非靜態(tài)成員class?Dog//類名
{static?Dog()//靜態(tài)構(gòu)造函數(shù),與類同名,無參數(shù),無訪問修飾符
{num=0;//只能訪問靜態(tài)成員
}
}
查看全部 -
結(jié)構(gòu)和類
1、不同點
結(jié)構(gòu)是值類型(在棧中),類是引用類型(在堆中)
結(jié)構(gòu)不支持繼承,類支持繼承
結(jié)構(gòu)不定義默認構(gòu)造函數(shù),編譯器會定義
2、適用場合
結(jié)構(gòu)由于分配內(nèi)存快,作用域結(jié)束即被刪除。不需要垃圾回收,用于小型數(shù)據(jù)結(jié)構(gòu),傳遞過程會復(fù)制,應(yīng)該用ref類參數(shù)傳遞提高效率。
類用于其他需要繼承體系的場合。
例如:定義食物是一個不需要長期存儲的數(shù)據(jù)類型,吃完就沒有了,所以可以定義一個食物struct關(guān)于堆和棧內(nèi)存:? ? ? 棧內(nèi)存:棧內(nèi)存首先是一片內(nèi)存區(qū)域,存儲的都是局部變量,凡是定義在方法中的都是局部變量(方法外的是全局變量),for循環(huán)內(nèi)部定義的也是局部變量,是先加載函數(shù)才能進行局部變量的定義,所以方法先進棧,然后再定義變量,變量有自己的作用域,一旦離開作用域,變量就會被釋放。棧內(nèi)存的更新速度很快,因為局部變量的生命周期都很短。? ? ?? 堆內(nèi)存:存儲的是數(shù)組和對象(其實數(shù)組就是對象),凡是new建立的都是在堆中,堆中存放的都是實體(對象),實體用于封裝數(shù)據(jù),而且是封裝多個(實體的多個屬性),如果一個數(shù)據(jù)消失,這個實體也沒有消失,還可以用,所以堆是不會隨時釋放的,但是棧不一樣,棧里存放的都是單個變量,變量被釋放了,那就沒有了。堆里的實體雖然不會被釋放,但是會被當成垃圾,Java有垃圾回收機制不定時的收取。
查看全部 -
接口
1、接口就是制定一組函數(shù)成員,而不實現(xiàn)他們的引用類型,用interface聲明。接口函數(shù)不能用其他訪問修飾符修飾,默認為public。interface ICatchMice{void CatchMice();}
2、接口只能用來被實現(xiàn)
例如? ?Cat:ICatchMice{ public void CatchMice(){...}
//實現(xiàn)接口函數(shù)
}Cat c=new Cat();
ICatchMice ic=(ICatchMice)c;
c.CatchMice(); //通過對象調(diào)用
ic.CatchMice(); //通過接口調(diào)用
3、一個類可以實現(xiàn)多個接口,當一個類同時繼承基類和實現(xiàn)接口時,應(yīng)該將基類寫在最前面,用逗號隔開
可實現(xiàn)多個接口? ? ??
Cat:Pet ,ICatchMice,IClimbTree? ?//基類? ? ? 接口1? ? ? ? 接口2
?{? ? ? ? ??
? ? ? ? ? ? public void CatchRat(){}.? ? ? ? ? ?
? ? ? ? ? ? ?public void ClimbTree()}
? ? ? ? ? ? ?...
}
4、一個類實現(xiàn)接口時,必須實現(xiàn)接口聲明的函數(shù)。
5、可以通過接口引用調(diào)用接口中的方法,也可通過實例調(diào)用接口方法。例子
爬樹為一個接口,抓老鼠為一個接口,當貓這個類實現(xiàn)這兩個接口時,
Cat c=new Cat("tom");
爬樹 ci=(爬樹)c;
c.pashu();//通過實例調(diào)用接口方法
ci.pashu();//通過接口引用調(diào)用接口方法查看全部 -
密閉類 密閉方法?
?sealed override public void Speak(){}
查看全部 -
派生類調(diào)用基類的構(gòu)造函數(shù)
查看全部 -
擴展想擴展類的方法
查看全部 -
抽象
查看全部 -
依賴倒置原則,程序盡量依賴于抽象類
查看全部 -
隱藏方法
查看全部 -
優(yōu)點
查看全部
舉報