抽象類更多的情況下是作為乙個模板使用,而介面更多的情況下是作為乙個標準出現。
乙個子類如果實現了乙個介面,則肯定要覆寫介面中的全部方法,那是否有一種方式,可以讓子類有選擇的去實現介面中的方法,而不是全都實現呢?
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 類中的方法不必是抽象的...