Design Pattern in Java[Challenge 2.1]
嘗試用簡單的語言,講述復(fù)雜的事情。
如發(fā)現(xiàn)文中的錯誤,或內(nèi)容需要補充,忘不吝指教!
CHALLENGE 2.1
Write down three differences between abstract classes and interfaces?in Java.
要想回答這個問題首先要搞清楚幾個概念問題。給出了一些概念在此引用
http://blog.csdn.net/chenssy/article/details/12858267
1.抽象類是什么一個具有abstract methods的類叫做抽象類,抽象類中可以不含有任何抽象方法,但是如果類中含有一個或多個抽象方法那么該類必須聲明為抽象類(并不強制所有方法都是abstract的)。
如果一個類沒有足夠的信息來描述一個具體的對象,而需要其他具體的類來支撐它,那么這樣的類我們稱它為抽象類。比如new Animal(),我們都知道這個是產(chǎn)生一個動物Animal對象,但是這個Animal具體長成什么樣子我們并不知道(depend on runtime info),它沒有一個具體動物的概念,所以他就是一個抽象類,需要一個具體的動物,如狗、貓來對它進行特定的描述,我們才知道它長成啥樣。
??????在面向?qū)ο箢I(lǐng)域由于抽象的概念在問題領(lǐng)域沒有對應(yīng)的具體概念,所以用以表征抽象概念的抽象類是不能實例化的。
2.為什么會有不含有任何抽象方法的抽象類
?因為抽象類是不能實例化的,所以可以通過對類聲明abstract來阻止該類的實例化。
3.抽象類的作用
由于面向?qū)ο蠛瓦\行時綁定的存在,我們無法在編譯期間確定所有生成的具體對象,即多態(tài)的概念(polymorphism).我們通過建立一個basic abstract class 為所有derived class提供一些common method。以便我們可以通過這些common method來操作derived classes。用C++中的說法就是用父類的指針去操作子類instance,在Java中應(yīng)該說是用父類的reference去操作子類的instance。所以抽象類的作用就是讓其他類來繼承它。
?
4.抽象類一些要求
?????? 1、抽象類不能被實例化(不能new 可以聲明reference),這是因為抽象類無法描述一個完整的instance 所以要到運行時子類來instantiate.
?????????2、抽象方法必須(Must be)由子類來進行重寫,這是因為abstract class中的abstract method都是空方法,子類不實現(xiàn)它就無法使用。
?????????3、只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。
?????????4、抽象類中可以包含具體的方法,當然也可以不包含抽象方法。
?????????5、子類中的抽象方法不能與父類的抽象方法同名。
?????????6、abstract不能與final并列修飾同一個類。這個很容易理解吧,abstract的意思就是讓其他類來繼承,final修飾class就是表示這個類不讓別的類繼承,同時修飾一個類就矛盾了。
?????????7、abstract 不能與private、static、final或native并列修飾同一個方法。Abstract method就是留給子類實現(xiàn)的,要么是protected的要么是public的,否則子類得不到這個方法。Static會似的該方法靜態(tài)化,可以直接通過abstract class來調(diào)用,但是abstract方法是空的,這樣做是沒意義的。
?
4.接口的作用
Interface使得所有實現(xiàn)了該接口的類建立了一套協(xié)議(protocol),使得這些類有了一套相同的manipulation。此外,在java中不能multiple inheritance所以無法通過繼承抽象類來同時擁有多套common method。但是一個class可以實現(xiàn)多個interface,從另一個方面解決了 multiple inheritance的需求。
5..接口的一些要求
(1)??? Interface的方所有法訪問權(quán)限自動被聲明為public。確切的說只能為public,當然你可以顯示的聲明為protected、private,但是編譯會出錯!(interface就是強迫實現(xiàn)他的類完成該interface的所有方法,再去隱藏方法就沒有意義了)
接口中可以定義“成員變量”,或者說是不可變的常量,因為接口中的“成員變量”會自動變?yōu)闉?/span>public static final。可以通過類命名直接訪問:ImplementClass.name。(因為interface并不會被實例化這些變量只是用來輔助記錄一些interface的信息,放到常量區(qū)中存放)
(2)??? 接口中不存在實現(xiàn)的方法。(前面已經(jīng)介紹過了,所有方法都是空body的)
實現(xiàn)接口的非抽象類必須要實現(xiàn)該接口的所有方法。抽象類可以不用實現(xiàn)。(抽象類實現(xiàn)一個接口的目的是:讓繼承該抽象類的子類去完成所有的事情,無需在抽象類中做具體實現(xiàn),這是因為可能不止一個類需要繼承這個abstract class,無法確定interface中的方法到底應(yīng)該是怎么樣實現(xiàn)的)
(3)不能使用new操作符實例化一個接口,但可以聲明一個接口變量,該變量必須引用(refer to)一個實現(xiàn)該接口的類的對象(類似多態(tài)的感覺 Interface referece A = new Obj_Implemented)。可以使用 instanceof 檢查一個對象是否實現(xiàn)了某個特定的接口。例如:if(anObject instanceof Comparable){}。
在實現(xiàn)多接口的時候一定要避免方法名的重復(fù)。
?
現(xiàn)在回到Design Pattern的 Challenge吧
Interface與Abstract class 的異同
?
abstract class C {public void method(){};private void pri_method(){};void pack_method(){};abstract public void ab_pub_method();abstract protected void ab_pro_method();abstract private void ab_pri_method();//error}?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Design Pattern in Java[Challenge 2.1]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编码问题总结
- 下一篇: java读写文件大全