abstract class Animal{
abstract void say();
}
public class Cat extends Animal{
public Cat(){
System.out.printf("I am a cat");//由於沒有定義爲抽象類,因此必須實現父類的抽象方法,編譯就報錯了
}
public static void main(String[] args) {
Cat cat=new Cat();
}
}
包含抽象方法的類稱爲抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類同樣,一樣能夠擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:架構
1)抽象方法必須爲public或者protected(由於若是爲private,則不能被子類繼承,子類便沒法實現該方法),缺省狀況下默認爲public。spa
2)抽象類不能用來建立對象;架構設計
3)若是一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。若是子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。設計
在其餘方面,抽象類和普通的類並無區別。日誌
抽象類與接口有什麼區別?code
接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。另外,接口和抽象類在方法上有區別:
1.抽象類能夠有構造方法,接口中不能有構造方法。
2.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。
3.抽象類中能夠有普通成員變量,接口中沒有普通成員變量
4. 抽象類中的抽象方法的訪問類型能夠是public,protected和默認類型
5. 抽象類中能夠包含靜態方法,接口中不能包含靜態方法
6. 抽象類和接口中均可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型能夠任意,但接口中定義的變量只能是public static final類型,而且默認即爲public static final類型
7. 一個類能夠實現多個接口,但只能繼承一個抽象類。兩者在應用方面也有必定的區別:接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契 約。而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用,例如,模板方法設計模式是抽象類的一個典型應用,假設某個項目的全部Servlet類都要用相 同的方式進行權限判斷、記錄訪問日誌和處理異常,那麼就能夠定義一個抽象的基類,讓全部的Servlet都繼承這個抽象基類,在抽象基類的service 方法中完成權限判斷、記錄訪問日誌和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼