這個也是不少筆試或者面試中常常出現的一個問題面試
首先咱們要理解抽象類是什麼ide
在面向對象領域中,萬物皆對象,同時全部的對象都是經過類來描述。可是並非全部的類都是來描述對象的spa
好比說new Animal(),這是產生了一個新的類,可是animal是什麼,咱們不知道,他沒有具體的動物的概念,因此他是一個抽象類。須要cat、dog這種具體的動物來進行描述code
抽象類須要其餘具體的類來支撐。對象
在面向對象領域中,因爲抽象的概念在問題領域沒有對應的具體概念,因此表現抽象概念的抽象類不能被實例化。blog
抽象類體現類數據抽象,是實現多態的機制,這組抽象方法的具體由它的派生類來實現。抽象類的存在就是爲了繼承繼承
抽象類的注意點:接口
一、抽象類不能被實例化,實例化的工做應該交由它的子類來完成,它只須要有一個引用便可。編譯
二、抽象方法必須由子類來進行重寫。class
三、只要包含一個抽象方法的抽象類,該方法必需要定義成抽象類,無論是否還包含有其餘方法。
四、抽象類中能夠包含具體的方法,固然也能夠不包含抽象方法。
五、子類中的抽象方法不能與父類的抽象方法同名。
六、abstract不能與final並列修飾同一個類。
實例:
1 public abstract class Animal { 2 public abstract void eat(); 3 } 4 5 public class Cat extends Animal{ 6 7 @Override 8 public void eat() { 9 System.out.println("貓吃魚..."); 10 } 11 } 12 13 public class Dog extends Animal{ 14 15 @Override 16 public void eat() { 17 System.out.println("狗吃骨頭..."); 18 } 19 20 } 21 22 public class Test { 23 24 public static void main(String[] args) { 25 Animal a1 = new Cat(); 26 Animal a2 = new Dog(); 27 28 a1.eat(); 29 a2.eat(); 30 } 31 } 32 33 -------------------------------------------------------------------- 34 Output: 35 貓吃魚... 36 狗吃骨頭...
Animal a1 = new Cat(); Animal a2 = new Dog();
向上轉型
接口
接口自己不是類,因此不能被實例化,咱們只能new它的實現類
實現該接口的實現類必需要實現接口的全部方法。
implement實現接口,接口實際上相似抽象類的一種延續,Java中的單繼承,可是接口能夠多實現
在使用接口過程當中須要注意以下幾個問題:
一、Interface的全部方法訪問權限自動被聲明爲public。確切的說只能爲public,固然你能夠顯示的聲明爲protected、private,可是編譯會出錯!
二、接口中能夠定義「成員變量」,或者說是不可變的常量,由於接口中的「成員變量」會自動變爲爲public static final。能夠經過類命名直接訪問:ImplementClass.name。
三、接口中不存在實現的方法。
四、實現接口的非抽象類必需要實現該接口的全部方法。抽象類能夠不用實現。
五、不能使用new操做符實例化一個接口,但能夠聲明一個接口變量,該變量必須引用(refer to)一個實現該接口的類的對象。可使用 instanceof 檢查一個對象是否實現了某個特定的接口。例如:if(anObject instanceof Comparable){}。
六、在實現多接口的時候必定要避免方法名的重複。