|
1.解釋什么是抽象類?
③ 抽象方法的內(nèi)容由他的繼承類根據(jù)繼承類自身情況去寫。重寫這個(gè)方法時(shí)把a(bǔ)bstract替換成override
例如: protected string name; protected abstract string Name { //定義抽象屬性 get; } protected int age; protected Class1() { name = "a"; age = 4; } protected abstract void A(); //定義抽象方法 protected override string Nam { //實(shí)現(xiàn)抽象屬性get { return name; } }
//實(shí)現(xiàn)方法時(shí)他的修飾符只能是范圍比父類大,或是相同 { //實(shí)現(xiàn)抽象方法 static void Main() { Class2 c = new Class2(); //正確,繼承類可以定義自己的對(duì)象 c.A(); } }
4.抽象類里的普通方法如果也想在子類中重寫,有兩種方法: ②在父類普通方法的返回類型前什么都不寫,在子類中重寫該方法時(shí),在方法的返回類型前可以什么也不寫,可以寫new 。然后子類對(duì)象調(diào)用的方法就是在子類中重寫的方法。 例如: { Protected abstract void A(); Protected void B(){ Console.WriteLine("bbbbb"); } } Class Class1:C { Protected void A() { Console.WriteLine("aaaaaaa"); } //Protected new void B(){ //正確} //Protected override void B(){//正確} Protected void B(){ //正確 Console.WriteLine("cccccccccccccc"); } Static void Main() { Class1 c1=new Class(); c.A(); 結(jié)果是:aaaaaaa cccccccccccccc c.B(); } }
抽象類和接口 抽象類 類中定義一些不含方法體的方法,它的方法體實(shí)現(xiàn)交給該類的子類根據(jù)自己的情況去實(shí)現(xiàn),這樣的方法就是抽象方法,包含抽象方法的類就是抽象類。包含的抽象方法一個(gè)或多個(gè)。。
定義規(guī)則: A. 抽象類abstract修飾符來(lái)修飾,抽象方法用abstract來(lái)修飾 B. 抽象類不能實(shí)例化(就是不能用new 去生成對(duì)象) C. 抽象方法只需聲明,不需實(shí)現(xiàn), D. 抽象方法的類必須聲明是抽象類,抽象類的子類必須覆蓋所有抽象方法后,才能被實(shí)例化,否則還是個(gè)抽象類
abstract int aa(int a){} // 錯(cuò),有花括號(hào),有實(shí)現(xiàn)部分,只不過為空、、、 正確的形式是:abstract int aa(int a); 抽象類中抽象的方法,必須有關(guān)鍵字abstract
Vehicle v = new Car(); 正確 // 多態(tài)的體現(xiàn),雖然抽象類不可以創(chuàng)建對(duì)象,但是可以聲明一個(gè)變量,引用可以實(shí)現(xiàn)了抽象方法的的子類對(duì)象,
子類可以繼承抽象類的屬性和方法(和普通類繼承一樣),父類抽象類定義非private的成員變量,子類可以繼承
接口(interface) 如果一個(gè)抽象類的所有方法都是抽象的,就可以將這個(gè)類用另外一種方式定義,用接口定義。 接口是抽象方法和常量值的集合,從本質(zhì)上講,接口是一種特殊的抽象類,其中沒有變量和方法實(shí)現(xiàn)。 定義:
public interface Runner{ int ID=1; void run( );//// 不用abstract修飾?。∵@點(diǎn)和抽象類不同。。要abstract也可以。 } 接口的特點(diǎn) : u 在接口里只能聲明抽象方法。 u 接口只能聲明常量(final) u 接口里只能聲明public的訪問權(quán)限 int ID = 1; 相當(dāng)于public static final int ID = 1; 接口定義中成員默認(rèn)都是public訪問類型的, 變量默認(rèn)都是public static final標(biāo)識(shí)的,所以接口中定義的變量都是全局靜態(tài)常量
用法: u 定義一個(gè)新接口,用extends繼承一個(gè)已有接口 u 定義一個(gè)類,用implements去實(shí)現(xiàn)一個(gè)接口中所有方法 u 定義一個(gè)抽象類,用implements去實(shí)現(xiàn)已有接口中的部分方法 u 可以實(shí)現(xiàn)多態(tài),例子如下 Fly[] flys = new Fly[2]; //可以實(shí)現(xiàn)多態(tài),只要實(shí)現(xiàn)了接口Fly的類的對(duì)象都可以用flys中元素指向 flys[0] = new Plane(); flys[1] = new Bird(); 但是只能直接訪問該接口中的定義的方法,如果要調(diào)用另外一個(gè)接口中定義的方法,要進(jìn)行格式轉(zhuǎn)換 Sing s = new Plane(); s.sing(); if (s instanceof Fly){ // 飛機(jī)實(shí)現(xiàn)了Fly,和Sing兩個(gè)接口 ((Fly)s).fly(); } u 多個(gè)接口,用逗號(hào)分隔。例如:class A implements Fly, Sing{};
接口和抽象類的區(qū)別?
|
|
|