【Head First Java 讀書筆記】(八)接口與抽象類

接口是什麼?它是一種百分之百純抽象的類。
什麼是抽象類?即沒法初始化的類。
 
例如,咱們設計一個animal類,以此類爲父類,分別設計了多種動物子類,例如Lion,Tiger,Cat,Wolf,Dog類。
 
Wolf aWolf = new Wolf();

Animal aHippo = new Hippo();

以上都是正確,而下面這句代碼就有問題了。

Animal anim = new Animal();

 

 
注意:有些類是不該該被初始化的,就是這些類不能被"new"出來。
經過標記類爲抽象類,編譯器就知道無論在哪裏,這個類就是不能建立任何類型的實例。
 
設計繼承結構時,就要肯定哪些類是抽象的,而哪些是具體的,具體的類是實際能夠被初始化爲對象的。
 
雖然抽象類不能建立實例,可是仍是可使用抽象類來聲明爲引用類型給多態使用。
 
抽象的方法
除了類以外,你也能夠將方法標記爲abstract。抽象的類表明此類必需要被extend過,抽象的方法表明此方法必定要被覆蓋過。
抽象的方法沒有實體!
若是你聲明出一個抽象的方法,就必須將類也標記爲抽象的。不能在非抽象類中擁有抽象方法。
 
問:爲何要有抽象的方法?我認爲抽象類的重點就在於能夠被子類繼承的共同程序代碼。
答:將可繼承的方法體(也就是有內容的方法)放在父類中是個好主意,但有時就是沒有辦法做出給任何子類都有意義的共同程序代碼。抽象方法的意義是就算沒法實現出方法的內容,但仍是能夠定義出一組子類共同的協議。
問:這樣作的好處是....?
答:就是多態!記住,你想達成的目標是要使用父型做爲方法的參數,返回類型,或數組的類型。經過這個機制,你能夠加入新的子型到程序中,卻又沒必要重寫或修改處理這些類型的程序。所以多態的好處就在於全部子型都會有那些抽象的方法。
 
你必須實現全部抽象的方法
實現抽象的方法就如同覆蓋過方法同樣
抽象的方法沒有內容,它只是爲了標記出多態而存在。
這表示在繼承樹結構下的第一個具體類必需要實現出全部的抽象方法。
 
要記得抽象類能夠帶有抽象和非抽象的方法。當咱們說到"你必須實現全部抽象的方法"時,表示說你必須寫出內容。
 
對象之母:Object
在java中的全部類都是從Object這個類繼承出來的。
沒有直接繼承過其餘類的類會是隱含的繼承對象。
 
Object中有什麼?

 

對象與抽象類
 
能夠覆蓋過Object的方法?
部分能夠。可是有些被標記final,這表明你不能覆蓋掉它們。強烈建議用本身寫的類去覆蓋掉hashCode(),equals(),toString()。
 
因此Object的主要目的是提供多態的參數與返回類型嗎?
這個Object類有兩個主要目的:做爲多態讓方法能夠應付多種類型的機制,以及提供java在執行期對任何對象都有須要的方法的實現程序代碼。
 
 
ArrayList<Object> myDogArrayList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogArrayList.add(aDog);
 
當運行如下代碼時:
Dog d = myDogArrayList.get(0);
沒法經過編譯,調用get方法會返回Object類

 

任何從ArrayList<Object>取出的東西都會被看成Object類型的引用而無論它原來是什麼。
 

 

 
「多態」意味着「不少形式」
當你把對象裝進ArrayList<Object>時,無論它原來是什麼,你只能把它看成是Object。
從ArrayList<Object>取出引用時,引用的類型只會是Object。
這表明你只會取得Object的遙控器。
 
接口(interface)能夠用來解決多重繼承的問題
java的接口就好像100%的純抽象類,全部接口的方法都是抽象的。
 
要點:
  • 若是不想讓某個類被初始化,就以abstract這個關鍵詞將它標記爲抽象的。
  • 抽象的類能夠帶有抽象和非抽象的方法。
  • 若是類帶有抽象的方法,則此類一定標識爲抽象的。
  • 抽象的方法沒有內容,它的聲明是以分號結束。
  • 抽象的方法必須在具體的類中運行。
  • java全部的類都是Object直接或間接的子類。
  • 方法能夠聲明Object的參數或返回類型。
  • 無論實際上所引用的對象是什麼類型,只有在引用變量的類型就是帶有某方法的類型時才能調用該方法。
  • Object引用變量在沒有類型轉換的狀況下不能賦值給其餘的類型,若堆上的對象類型與所要轉換的類型不兼容,則此轉換會在執行期產生異常。
  • 從ArrayList<Object>取出的對象只能被Object引用,否則就要用類型轉換來改變。
  • java不容許多重繼承
  • 接口就好像是100%純自然抽象類
  • 以interface這個關鍵詞取代class來聲明接口
  • 實現接口時要使用implements這個關鍵詞。
  • class能夠實現多個接口
  • 實現某接口的類必須實現它全部的方法。
  • 要從子類調用父類的方法能夠用super這個關鍵詞來引用。
相關文章
相關標籤/搜索