網(wǎng)站加載頁模板太倉seo網(wǎng)站優(yōu)化軟件
1、抽象類和接口的定義:
(1)抽象類主要用來抽取子類的通用特性,作為子類的模板,它不能被實例化,只能被用作為子類的超類。
(2)接口是抽象方法的集合,聲明了一系列的方法操作,如果一個類實現(xiàn)了某個接口,那么它必須實現(xiàn)這個接口的所有抽象方法。
2、抽象類與接口的區(qū)別:
(1)抽象類和接口都用于抽象化具體對象的,都不能直接實例化,但是兩者的側(cè)重點不同:抽象類主要用來抽象類型,表示這個對象是什么;接口主要用來抽象功能,表示這個對象能做什么;
(2)接口可以看成抽象類的變體,所有方法都是抽象的,因此接口只能做方法的聲明,不能有方法的實現(xiàn);而抽象類可以有默認(rèn)的方法實現(xiàn),既可以做方法的聲明,也可以做方法的實現(xiàn);
如果往抽象類中添加新的方法,可以給他提供默認(rèn)的實現(xiàn),因此可以不需要改變子類的代碼;如果往接口中添加方法,那么必須改變實現(xiàn)該接口的類(JDK8 之后,接口也可以有默認(rèn)的實現(xiàn))
(3)接口可以繼承多個接口,抽象類不可以多繼承類,但可以單繼承類或多實現(xiàn)接口。
(4)抽象方法和接口函數(shù)都不能使用static修飾。抽象方法的訪問修飾符可以是public、protected和default,不能是private;接口的默認(rèn)訪問修飾符為public,不能使用其他修飾符。
(5)接口的變量只能是不可變常量,默認(rèn)修飾符都是public static final;但是抽象類的變量可以是普通變量
(6)抽象類可以有構(gòu)造器,接口不能有構(gòu)造器。
(7)接口實現(xiàn)類必須實現(xiàn)接口中的所有聲明的方法,但抽象類的子類可以部分實現(xiàn)父類的抽象方法,但如果子類不能全部實現(xiàn)抽象方法,那么該子類只能是抽象類;
(8)與正常Java類的相比,抽象類除了不能實例化之外,和正常Java類沒有任何區(qū)別,但接口和正常Java類是完全不同的類型。
(9)抽象類和接口是Java語言中兩種不同的抽象概念,他們的存在對多態(tài)提供了非常好的支持,雖然他們之間存在很大的相似性。抽象類的功能遠(yuǎn)遠(yuǎn)超過接口,但是定義抽象類的代價比較高。因為每個類只能繼承一個類。因此,在這個抽象類中,你必須編寫出其子類的所有共性。雖然接口在功能上會弱化很多,但是他只是針對一組動作的描述,而且可以在一個類中同時實現(xiàn)多個接口,因此在設(shè)計階段會降低難度。
3、分別在哪些地方使用抽象類和接口?
(1)當(dāng)你關(guān)注一個事物的本質(zhì)時,使用抽象類;當(dāng)你關(guān)注一組操作的時候,使用接口。
(2)如果擁有一些方法并且想讓他們中有一些默認(rèn)的是實現(xiàn),那么可以使用抽象類。
(3)如果想實現(xiàn)多重繼承,那必須使用接口。由于Java不支持多繼承,子類不能夠繼承多類,但是可以實現(xiàn)多個接口。
(4)如果基本功能在不斷改變,那么就需要使用抽象類,如果不斷改變基本功能并且使用接口,那么就需要改變所有實現(xiàn)了該接口的類。
四、總結(jié)
1、 抽象類在java語言中所表示的是一種繼承關(guān)系,一個子類只能存在一個父類,但是可以存在多個接口。
2、 在抽象類中可以擁有自己的成員變量和非抽象類方法,但是接口中只能存在靜態(tài)的不可變的成員數(shù)據(jù)(不過一般都不在接口中定義成員數(shù)據(jù)),而且它的所有方法都是抽象的。
3、抽象類和接口所反映的設(shè)計理念是不同的,抽象類所代表的是“is-a”的關(guān)系,而接口所代表的是“l(fā)ike-a”的關(guān)系
抽象類和接口是java語言中兩種不同的抽象概念,他們的存在對多態(tài)提供了非常好的支持,雖然他們之間存在很大的相似性。但是對于他們的選擇往往反應(yīng)了您對問題域的理解。只有對問題域的本質(zhì)有良好的理解,才能做出正確、合理的設(shè)計。