抽象類是由abstract修飾的類,定義方式如public abstract class A{...}。 介面由interface修飾,定義方式如public interface B{...}。 抽象類與介面的具體特性見下文。 抽象類: (1).抽象類中由abstract修飾的方法稱為抽象方法,抽象 ...
抽象類是由abstract修飾的類,定義方式如public abstract class A{...}。
介面由interface修飾,定義方式如public interface B{...}。
抽象類與介面的具體特性見下文。
抽象類:
(1).抽象類中由abstract修飾的方法稱為抽象方法,抽象方法沒有具體實現,要等子類繼承後再實現;聲明方式如public abstract void run();。
(2).只要某類中有一個方法為抽象方法,該類就必須要定義為抽象類。
(3).抽象類不一定有抽象方法,也不一定沒有非抽象方法,或者說抽象類可以沒有抽象方法,也可以有非抽象方法;也就是說,一個類是不是抽象類,不是由類中是否有抽象方法決定的,而是在定義類時就確定了的,只要是由abstract修飾的類就是抽象類。對於抽象類中不含抽象方法這一點,如果不希望實例化某個類時,可以如此。
(4).非抽象的子類繼承抽象類後,必須實現父類的所有抽象方法;由於子類繼承了父類的所有方法,所以,如果還有未實現的抽象方法的話,該子類就應該定義為抽象類了。繼承抽象類時使用關鍵字extends。
(5).抽象的子類繼承抽象類後,可以不實現父類的抽象方法,也可以定義自己的抽象方法。
(6).抽象類有構造方法,可以有成員變數,但不能實例化;需要通過繼承它的子類來間接實例化。抽象類之所以叫抽象類,正是因為它比較抽象,不能具體化成某個對象,也就是說實例化的時候根本不知道要把它實例化成一個什麼東西,所以它沒法實例化;比如,有一個抽象類叫“生物”,實例化的時候這個“生物”長什麼樣呢,大家都不知道,而當“狗”這個子類繼承“生物”後,再實例化狗,就知道應該怎麼實例化了,狗是一個具象的概念,大體的輪廓大家都知道,至於再具體一點,哈皮狗啊吉娃娃啊,這又屬於“狗”的子類了。
介面:
(1).介面中的所有方法都是抽象方法。
(2).介面內的變數都是public static final的,而且必須是這樣的,即使沒有顯式聲明;也就是說,介面內的變數是靜態的、不能修改的;定義時要賦初值,通過介面名來訪問。一般不在介面中定義變數,我理解的是,介面可以由各種各樣的類來實現,這些類可以是完全不相干的類,如果在介面中定義了變數的話,這些變數就是由實現介面的所有類共用的,實際上這些類不一定有這麼些共同的屬性存在,所以最好不在介面中定義變數,有需要就在各個類中各自定義比較好。
(3).介面要由類來實現,所有方法都要實現;類只能繼承一個父類,但可以實現多個介面,介面之間用逗號分隔,如 class A implements interface1,interface2。我們可以把類想像成一塊軟軟的麵團,把介面當成各種各樣的豆子,花生豆是一種介面,紅豆是一種介面,綠豆也是一種介面;當類要實現介面時就把豆子嵌到麵團上,麵團上可以按上好多種類的豆子,也即類可以實現多個介面。
(4).介面沒有構造方法,不能實例化;從這也可以理解為什麼介面中的變數要是static、final的。可以把介面當成一種標準,一種固定的東西,不輕易改變,像上面的各種豆子一樣,有類需要實現介面就按上一種豆子,而這些豆子不需要自己生成新的豆子,只有麵團上要嵌入豆子時才拿來用,也就是說不需要生成一個介面對象,只有類需要它的時候才去實現它。
抽象類與介面都是為了繼承與多態,它們都需要子類來繼承才有意義,最終目的是為了多態;子類重寫了父類的方法,再通過向上轉型,由父類對象引用指向子類對象,達到運行時動態調用子類方法的目的。
抽象類是某一類事物的一種抽象,而介面不是類,它只定義了某些行為;如,“生物”類雖然抽象,但有“狗”類的雛形,介面中的run方法可以由狗類實現,也可以由汽車實現。
如有錯誤,歡迎指正。
另:如需轉載,請在標題註明(轉載),併在正文加上本文鏈接:http://www.cnblogs.com/chanchan/p/7888324.html
其他的話:
最近在不同的地方有兩次都是偶然間發現有其他人奉行“拿來主義”,在其自己的平臺上發表本人的學習筆記。我並沒有標榜自己寫得有多好或怎樣,但看到這樣的情況心裡不免有點不舒服。畢竟這是我認認真真、辛辛苦苦一個字一個字碼出來的,而且是犧牲自己的睡眠時間擠時間寫出來的,因為每天要等娃睡了我才有點時間乾點自己的事情。大家都不容易,還希望每個人都能尊重別人的勞動成果吧。
具體例子如下:
包animals中定義了Animal類、Mammal類、Dog類,其中Animal、Mammal都是抽象類,Mammal類繼承了Animal類,Dog類繼承了Mammal類;
還定義了兩個介面,Interface1和Interface2,Dog類分別實現了這兩個介面。
結果就不一一分析了。
附代碼:
package animals; public abstract class Animal { public Animal() { System.out.println("Animal constructor"); } public abstract void eat(); public abstract void sleep(); } package animals; public abstract class Mammal extends Animal { int mam = 3; public Mammal() { System.out.println("Mammal constructor"); } public abstract void run(int a); public abstract void run(); public void breathe() { System.out.println("Mammal:breathe"); } } package animals; public interface Interface1 { int infc1 = 2; public abstract void run(); } package animals; public interface Interface2 { public abstract void swim(); } package animals; public class Dog extends Mammal implements Interface1,Interface2 { public Dog() { System.out.println("Dog constructor"); } //animal public void eat() { System.out.println("eat"); } //animal public void sleep() { System.out.println("sleep"); } //mammal public void run(int a) { System.out.println("a=" + a); System.out.println("run(a)"); } //interface1 public void run() { System.out.println("run"); } //interface2 public void swim() { System.out.println("swim"); } public static void main(String[] args) { Dog dogT = new Dog(); Mammal mal = dogT;//向上轉型 Animal ani = dogT;//向上轉型 Interface1 infc1 = dogT;//向上轉型 Interface2 infc2 = dogT;//向上轉型 System.out.println(dogT.mam); System.out.println(dogT.infc1); System.out.println(Dog.infc1); System.out.println("dogT.eat():"); dogT.eat(); System.out.println("dogT.sleep():"); dogT.sleep(); System.out.println("dogT.run(8):"); dogT.run(8); System.out.println("dogT.run():"); dogT.run(); System.out.println("dogT.swim():"); dogT.swim(); System.out.println("mal.eat():"); mal.eat(); System.out.println("mal.sleep():"); mal.sleep(); System.out.println("mal.run(9):"); mal.run(9); System.out.println("mal.run():"); mal.run(); System.out.println("ani.eat():"); ani.eat(); System.out.println("ani.sleep():"); ani.sleep(); System.out.println("infc1.run():"); infc1.run(); System.out.println("infc2.swim():"); infc2.swim(); } }
輸出結果如下:
1 Animal constructor 2 Mammal constructor 3 Dog constructor 4 3 5 2 6 2 7 dogT.eat(): 8 eat 9 dogT.sleep(): 10 sleep 11 dogT.run(8): 12 a=8 13 run(a) 14 dogT.run(): 15 run 16 dogT.swim(): 17 swim 18 mal.eat(): 19 eat 20 mal.sleep(): 21 sleep 22 mal.run(9): 23 a=9 24 run(a) 25 mal.run(): 26 run 27 ani.eat(): 28 eat 29 ani.sleep(): 30 sleep 31 infc1.run(): 32 run 33 infc2.swim(): 34 swim