抽象:
抽象類不能被實(shí)例化(初學(xué)者很容易犯的錯(cuò)),如果被實(shí)例化,就會(huì)報(bào)錯(cuò),編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對(duì)象。
抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實(shí)現(xiàn)也就是方法的具體功能。
構(gòu)造方法,類方法(用 static 修飾的方法)不能聲明為抽象方法。
抽象類的子類必須給出抽象類中的抽象方法的具體實(shí)現(xiàn),除非該子類也是抽象類。
抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實(shí)現(xiàn)。抽象方法的聲明格式為:
//擁有抽象方法,類也必須是抽象類。但并不意味著抽象類智能有抽象方法,也可也有普通方法
//因?yàn)槌橄箢愔泻袩o具體實(shí)現(xiàn)的方法,所以不能用抽象類創(chuàng)建對(duì)象
public abstract abstractTest{
abstract void fun();
}
1、抽象方法必須為public或者protected(因?yàn)槿绻麨閜rivate,則不能被子類繼承,子類便無法實(shí)現(xiàn)該方法),缺省情況下默認(rèn)為public。
2、抽象類不能用來創(chuàng)建對(duì)象;
3、如果一個(gè)類繼承于一個(gè)抽象類,則子類必須實(shí)現(xiàn)父類的抽象方法。如果子類沒有實(shí)現(xiàn)父類的抽象方法,則必須將子類也定義為為abstract類。在其他方面,抽象類和普通的類并沒有區(qū)別。
接口:
接口泛指供別人調(diào)用的方法或者函數(shù)。從這里,我們可以體會(huì)到Java語(yǔ)言設(shè)計(jì)者的初衷,它是對(duì)行為的抽象。在Java中,定一個(gè)接口的形式如下:
public interface interfaceTest(){
}
接口中可以含有 變量和方法。但是要注意,接口中的變量會(huì)被隱式地指定為public static final變量(并且只能是public static final變量,用private修飾會(huì)報(bào)編譯錯(cuò)誤),而方法會(huì)被隱式地指定為public abstract方法且只能是public abstract方法(用其他關(guān)鍵字,比如private、protected、static、 final等修飾會(huì)報(bào)編譯錯(cuò)誤),并且接口中所有的方法不能有具體的實(shí)現(xiàn),也就是說,接口中的方法必須都是抽象方法。從這里可以隱約看出接口和抽象類的區(qū)別,接口是一種極度抽象的類型,它比抽象類更加“抽象”,并且一般情況下不在接口中定義變量。