小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java接口和抽象類的區(qū)別

 黑山l白水 2016-03-16
類是對象的模板,抽象類和接口可以看做是具體的類的模板。

由于從某種角度講,接口是一種特殊的抽象類,它們的淵源頗深,有很大的相似之處,所以在選擇使用誰的問題上很容易迷糊。我們首先分析它們具有的相同點(diǎn)。
  • 都代表類樹形結(jié)構(gòu)的抽象層。在使用引用變量時(shí),盡量使用類結(jié)構(gòu)的抽象層,使方法的定義和實(shí)現(xiàn)分離,這樣做對于代碼有松散耦合的好處。
  • 都不能被實(shí)例化。
  • 都能包含抽象方法。抽象方法用來描述系統(tǒng)提供哪些功能,而不必關(guān)心具體的實(shí)現(xiàn)。

下面說一下抽象類和接口的主要區(qū)別。

1) 抽象類可以為部分方法提供實(shí)現(xiàn),避免了在子類中重復(fù)實(shí)現(xiàn)這些方法,提高了代碼的可重用性,這是抽象類的優(yōu)勢;而接口中只能包含抽象方法,不能包含任何實(shí)現(xiàn)。
  1. public abstract class A{
  2. public abstract void method1();
  3. public void method2(){
  4. //A method2
  5. }
  6. }
  7. public class B extends A{
  8. public void method1(){
  9. //B method1
  10. }
  11. }
  12. public class C extends A{
  13. public void method1(){
  14. //C method1
  15. }
  16. }
抽象類A有兩個(gè)子類B、C,由于A中有方法method2的實(shí)現(xiàn),子類B、C中不需要重寫method2方法,我們就說A為子類提供了公共的功能,或A約束了子類的行為。method2就是代碼可重用的例子。A 并沒有定義 method1的實(shí)現(xiàn),也就是說B、C 可以根據(jù)自己的特點(diǎn)實(shí)現(xiàn)method1方法,這又體現(xiàn)了松散耦合的特性。

再換成接口看看:
  1. public interface A{
  2. public void method1();
  3. public void method2();
  4. }
  5. public class B implements A{
  6. public void method1(){
  7. //B method1
  8. }
  9. public void method2(){
  10. //B method2
  11. }
  12. }
  13. public class C implements A{
  14. public void method1(){
  15. //C method1
  16. }
  17. public void method2(){
  18. //C method2
  19. }
  20. }
接口A無法為實(shí)現(xiàn)類B、C提供公共的功能,也就是說A無法約束B、C的行為。B、C可以自由地發(fā)揮自己的特點(diǎn)現(xiàn)實(shí) method1和 method2方法,接口A毫無掌控能力。

2) 一個(gè)類只能繼承一個(gè)直接的父類(可能是抽象類),但一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,這個(gè)就是接口的優(yōu)勢。
  1. interface A{
  2. public void method2();
  3. }
  4. interface B{
  5. public void method1();
  6. }
  7. class C implements A,B{
  8. public void method1(){
  9. //C method1
  10. }
  11. public void method2(){
  12. //C method2
  13. }
  14. }
  15. //可以如此靈活的使用C,并且C還有機(jī)會(huì)進(jìn)行擴(kuò)展,實(shí)現(xiàn)其他接口
  16. A a=new C();
  17. B b=new C();
  18. abstract class A{
  19. public abstract void method1();
  20. }
  21. abstract class B extends A{
  22. public abstract void method2();
  23. }
  24. class C extends B{
  25. public void method1(){
  26. //C method1
  27. }
  28. public void method2() {
  29. //C method2
  30. }
  31. }
對于C類,將沒有機(jī)會(huì)繼承其他父類了。

綜上所述,接口和抽象類各有優(yōu)缺點(diǎn),在接口和抽象類的選擇上,必須遵守這樣一個(gè)原則:
  • 行為模型應(yīng)該總是通過接口而不是抽象類定義,所以通常是優(yōu)先選用接口,盡量少用抽象類。
  • 選擇抽象類的時(shí)候通常是如下情況:需要定義子類的行為,又要為子類提供通用的功能。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多