再看抽象類與介面

2021-09-21 12:15:53 字數 3057 閱讀 6939

抽象類更多的情況下是作為乙個模板使用,而介面更多的情況下是作為乙個標準出現。

乙個子類如果實現了乙個介面,則肯定要覆寫介面中的全部方法,那是否有一種方式,可以讓子類有選擇的去實現介面中的方法,而不是全都實現呢?

inte***ce a

以上的介面的子類能否有選擇性的進行所需要方法的覆寫呢?

inte***ce a

abstract class aadapter implements a

public void printb() {}

public void printc() {}

public void printd() {}

public void printe() {}

};class aaa extends aa

};思考:

張三去酒會參加活動,碰見了乙個美國女孩,想跟她說「hello,make friend」,第二次又參加了乙個舞會,又碰見了乙個中國的女孩,想跟她說「你好,我想跟你交朋友」。

·碰見美國人說英語

·碰見中國人說中文

·介面的第二個作用就是表示一種能力。

inte***ce saychina

inte***ce sayenglish

class person implements saychina,sayenglish

public void sayenglish()

};思考:

現在孫鍵欠了我500000000元錢,此時,王寧是乙個老實人,孫鍵欺負他,不還,之後王寧沒有辦法了,找到了王偉(專門的討債公司),準備好了繩索、刀子、槍枝,從孫鍵手裡把銀子要了回來,之後銷毀了一切的證據。但是王寧只管拿回了自己的錢。

可以按照以下的形式組織**:

inte***ce subject

class realsubject implements subject

};class proxysubject implements subject

public void before()

public void givemoney()

public void after()

};public class demo06

};問題的引出:現在使用乙個介面,同時定義出子類,通過子類為介面進行例項化:

inte***ce fruit

public void eat()

};public class demo07

};以上**存在問題?

· main方法實際上相當於是乙個客戶端程式

·如果現在需要換乙個子類了,那麼就要修改客戶端。

·好的程式:某一處的更改不影響呼叫處

造成以上問題的根源:

·子類直接在客戶端使用,耦合度太深了。

在物件例項化的中間加入乙個過渡端,所謂的解耦合最大的特點就是永遠有乙個過渡端。

那麼現在加入乙個過渡端:

inte***ce fruit

public void eat()

};class cherry implements fruit

};class factory

if("cherry".equals(str))

return f ;

}

};

public class demo08

};此時,發現程式的客戶端沒有任何的改變,而直接可以選擇各種所要的子類。那麼通過工廠取得全部的介面例項,那麼以後修改的時候就可以只修改工廠了。

區別點

抽象類

介面

定義

abstract class 

抽象類名稱{}

inte***ce 

介面名稱{}

概念

包含乙個抽象方法的類就是抽象類,除此之外還包含常量、變數、普通方法、構造方法

只包含全域性常量和抽象方法的類稱為介面

使用

需要通過子類繼承

class 

子類extends 父類

需要通過子類實現

class 

子類implements 

介面關係

乙個抽象類可以實現多個介面,乙個介面不能繼承乙個抽象類

作用

提供了乙個模板

提供了乙個標準,或者說表示了一種能力

設計模式

模板設計模式

工廠設計模式、**設計模式

介面卡設計模式

限制

抽象類有單繼承侷限

無此侷限

應用

如果抽象類與介面同時都可以使用,優先使用介面

特殊點

乙個抽象類可以包含乙個介面或乙個抽象類

乙個介面中也可以包含抽象類或介面

特殊點:

1、乙個抽象類中能否包含乙個介面?可以

abstract class a

};class da extends a

class db implements b

};};

2、乙個介面中能否包含乙個抽象類?可以

inte***ce a

};class da implements a

class db extends b

};};

觀察以下的題目,寫出輸出結果:

abstract class a

public abstract void print() ;

}class b extends a

public void print()

};public class demo11

};答案是0

子類物件例項化之前,肯定要先去呼叫父類中的無參構造方法,為父類中的屬性初始化,但是父類中的方法未呼叫完之前,子類的內容並沒有初始化,如果沒有初始化,則會安排預設值,預設值就是「0」。

介面與抽象類

介面與抽象類區別 個人總結 語法結構 1 型別可以繼承多個介面,但是只能繼承乙個抽象類,即不支援多重繼承。2 介面可以用於值型別和引用型別,例如struct和class,而抽象類不能用於值型別,只能用於引用型別。3 抽象類定義可以包括建構函式,字段資料,非抽象成員 具體實現 等,而介面只能包括抽象成...

介面與抽象類

抽象類 當抽象類作為父類時,他的子類對其中的抽象類方法有不同的方法體 簡單舉例為 classhorse mammal,ilangbound public int numeroflegs return 4 inte ce ilandbound int numberoflegs 介面例子 main函式 ...

抽象類與介面

記住抽象類與普通類的唯一區別就是不能建立例項物件和允許有abstract 方法含有abstract 修飾符的 class 即為抽象類,abstract 類不能建立的例項物件。含有 abstract 方法的類必須定義為 abstract class abstract class 類中的方法不必是抽象的...