深入淺析Java 抽象類和接口
一、抽象類
1.抽象類
1.1抽象類的定義
在Java面向?qū)ο螽?dāng)中,所有的對象都是用過類進行描繪的,但是并不是所有的類都是用來描繪對象的,如果一個類沒有包含足夠多的信息來描述一個具體的對象,這樣的類就是抽象類。
1.2抽象方法的定義方式
public abstract 返回值類型 方法名(參數(shù));
1.3抽象類的定義方式
abstract class 類名 { }
2.抽象類和實例類的區(qū)別
抽象類不可以實例化對象實例類可以實例化對象
3.抽象類示例
定義一個抽象類People,在類中定義一個方法work,不確定人怎么工作,可以定義成抽象方法,來解決父類方法的不確定性。抽象方法不能在父類中實現(xiàn),所以沒有函數(shù)體。那么在后續(xù)繼承時,要在子類中重寫該方法,要具體實現(xiàn)該方法。 注意:抽象類中可以包含抽象方法,包含抽象方法的類一定要定義成抽象類。
public abstract class People { String name; int age; public abstract void work(); }
定義一個Student類繼承抽象類People。一個子類繼承一個抽象類,必須重寫這個抽象類中的所有抽象方法,否則就把子類定義成一個抽象類。
public class Student extends People{ int score; int stu_id; //重寫繼承抽象類當(dāng)中的work方法 @Override public void work() { System.out.println("好好學(xué)習(xí)!年薪百萬,迎娶白富美?。?!"); } }
定義一個測試類TestDemo。
public class TestDemo { public static void main(String[] args) { People p = new Student(); p.work(); } }
運行觀察運行結(jié)果。
多態(tài)的使用,基類的引用變量引用派生類的對象,調(diào)用work方法,實現(xiàn)的是派生類Student類中對其抽象基類重寫的work方法。
4.抽象類的特征
①抽象類不能實例化對象,所以抽象類必須被繼承才能使用,其他的功能和普通類相同。 ②一個類只能繼承一個抽象類。其實在Java中一個類只能繼承一個類,不管它的父類是不是抽象類。下面圖示解釋一下。
如果允許多繼承,在圖示中,D類同時繼承了B類和C類,那么在D類中同時出現(xiàn)了兩個一毛一樣的實例變量a,這是不允許的,因為在同一個作用域中不能重復(fù)定義實例變量。因此在Java中只能單一繼承,即一個類只能有一個父類。 ③抽象類的修飾符不能是private。 ④抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。 ⑤構(gòu)造方法,類方法不能聲明為抽象方法。 ⑥抽象類的子類必須給出抽象類中的抽象方法的具體實現(xiàn),除非該子類也是抽象類。
二、接口
1.接口
1.1接口的定義
在軟件工程中,接口泛指供別人調(diào)用的方法。在Java中接口是一個抽象類型,比抽象類更加抽象,是抽象方法的集合。一個類通過繼承接口的方式,從而繼承接口的抽象方法。從定義上看,接口只是一個集合,并不是類。類描述了屬性和方法,而接口只包含方法(未實現(xiàn)的方法)和常量。
1.1定義一個接口
public interface 接口名稱 { //聲明常量 //抽象方法 }
如下:
①接口的變量會被隱式的指定為public static final 變量(并且只能是public static final變量,用private修飾會編譯報錯) ②接口的方法會被隱式的指定為public abstract 方法。
在接口中定義變量可以省略或少些修飾符,因為底層會給你補全,但是不允許寫錯。
1.2 接口的使用
類名 implements 接口名稱[, 其他接口名稱, 其他接口名稱…, …]
在Java中一個類雖然只能繼承一個類,但是一個類可以實現(xiàn)多個接口。也就是說單一繼承,多實現(xiàn)。
1.3接口的注意事項
①接口中所有的方法不能有具體的實現(xiàn),也就是說,接口中的方法必須都是抽象方法。從這里可以隱約看出接口和抽象類的區(qū)別,接口是一種極度抽象的類型,它比抽象類更加“抽象”,并且一般情況下不在接口中定義變量。 ②在抽象類中,可以包含一個或多個抽象方法,但是在接口中,所有的方法必須是抽象的,不能有方法體,比抽象類更加的抽象。接口規(guī)定一個類必須做什么而不規(guī)定他如何去做。
2.接口示例
定義一個接口A
public interface A { //聲明常量 final int a = 10; //抽象方法 public abstract void fun(); }
定義一個B類實施接口A
public class B implements A { //對接口A里面的抽象方法重寫 @Override public void fun() { System.out.println("重寫fun()"); } }
定義一個TestDemo測試類實現(xiàn)調(diào)用
public class TestDemo { public static void main(String[] args) { B b = new B(); b.fun(); //多態(tài) 基接口的引用 引用 實現(xiàn)該接口的對象 A a = new B(); a.fun(); } }
注意:如果一個普通類要同時繼承一個類和實現(xiàn)接口,應(yīng)該先繼承后實現(xiàn),否則就會語法報錯。例如:public class A extends B implements C,D E…
3.接口的特征
①接口中只定義抽象方法,這些方法默認都是public abstract的,在方法聲明時可以省略這些修飾符。 ②在接口中定義實例變量,非抽象實例方法以及靜態(tài)方法都是不允許的。 ③接口中沒有構(gòu)造方法,也不能被實例化。 ④一個接口不能實現(xiàn)另一個接口,但是可以多繼承其他接口。 ⑤接口必須通過類來實現(xiàn)它的抽象方法。 ⑥如果一個類不能實現(xiàn)完接口中的抽象方法,那么這個類我們應(yīng)該設(shè)計為抽象類。 ⑦不允許創(chuàng)建接口的實例,但是允許定義接口類型的引用變量引用實現(xiàn)該接口的類的實例(多態(tài))
三、抽象類和接口的區(qū)別
①抽象類可以提供成員方法的實現(xiàn)細節(jié),而接口中只能存在public abstract 方法; ②抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的; ③接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法,而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法; ④一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口;
到此這篇關(guān)于Java 抽象類和接口的文章就介紹到這了,更多相關(guān)Java 抽象類和接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Druid連接池未關(guān)閉導(dǎo)致內(nèi)存泄漏問題
這篇文章主要介紹了Druid連接池未關(guān)閉導(dǎo)致內(nèi)存泄漏問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Hibernate映射解析之關(guān)聯(lián)映射詳解
所謂關(guān)聯(lián)映射就是將關(guān)聯(lián)關(guān)系映射到數(shù)據(jù)庫里,在對象模型中就是一個或多個引用。下面這篇文章詳細的給大家介紹了Hibernate映射解析之關(guān)聯(lián)映射的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02mybatis-plus 處理大數(shù)據(jù)插入太慢的解決
這篇文章主要介紹了mybatis-plus 處理大數(shù)據(jù)插入太慢的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12