接口/內(nèi)部類/異常處理
interface
接口和類是并列的兩個結(jié)構(gòu)
如何定義接口:
JDK7以前:只能定義全局常量和抽象方法
全局常量:public static final,可以省略,會默認(rèn)加上
抽象方法:public abstract
JDK8:除了定義全局常量和抽象方法之外,還可以定義靜態(tài)方法、默認(rèn)方法
接口中定義的靜態(tài)方法,只能通過接口來調(diào)用。
通過實現(xiàn)類的對象,可以調(diào)用接口中的默認(rèn)方法,默認(rèn)方法,子類拿來可以直接調(diào)。
如果子類(或?qū)崿F(xiàn)類)繼承的父類和實現(xiàn)的接口中聲明了同名同參數(shù)的方法,那么子類在沒有重寫此方法的情況下,默認(rèn)調(diào)用的是父類中的同名同參數(shù)的方法 。 --> 類優(yōu)先原則
如果實現(xiàn)類實現(xiàn)了多個接口,而這多個接口中定義了同名同參數(shù)的默認(rèn)方法,那么在實現(xiàn)類沒有重寫此方法的情況下,報錯。 --> 接口沖突
接口通過類去實現(xiàn)(implements)的方式來使用。
如果實現(xiàn)類覆蓋了接口中的所有抽象方法,則此實現(xiàn)類就可以實例化
如果實現(xiàn)類沒有覆蓋接口中所有的抽象方法,則此實現(xiàn)類仍為一個抽象類,如果實現(xiàn)類重寫了接口中的默認(rèn)方法,調(diào)用時,仍然調(diào)用的是重寫以后的方法
JAVA 可以實現(xiàn)多接口
內(nèi)部類
分類:成員內(nèi)部類(靜態(tài)、非靜態(tài)) ?vs 局部內(nèi)部類(方法內(nèi)、代碼塊內(nèi)、構(gòu)造器內(nèi))
成員內(nèi)部類:
可以被final修飾,表明此類不能被繼承
可以被absract修飾
可以被四種不同修飾符修飾
局部內(nèi)部類的使用:
在局部內(nèi)的方法中(比如 show),如果調(diào)用局部內(nèi)部類所聲明的方法(比如 : method ) 中的局部變量的話,要求此局部變量聲明為final的。
面試題:
抽象類和接口的異同?
相同點:不能實例化;都可以包括抽象方法;
不同點:
把抽象類和接口(Java 7 ,java8 ,java9)的定義、內(nèi)部結(jié)構(gòu)解釋說明
類: 單繼承 接口:多繼承; 類與接口: 多實現(xiàn)
異常處理
體系結(jié)構(gòu):
總父類:Trowable
java.lang.error :一般不編寫針對性的代碼進(jìn)行處理。
java.lang.Exception :可以進(jìn)行異常的處理
編譯時異常(check)
運行時異常(uncheck) --- RuntimeException
try-catch-finally
catch 中的異常類型,如果沒有子父類關(guān)系,則無順序要求
如果有子類關(guān)系,則要求子類一定要父類上面
常用的兩種處理方法:
getMessage () ; // String
printStackTrace () : ?// void
在try中聲明的變量,出了try就用不了了
finally 中聲明的是一定會被執(zhí)行的代碼。即使catch中又出現(xiàn)異常了。 try中有return語句的情況,catch中有return語句的情況。
像數(shù)據(jù)庫連接、輸入輸出流、socket連接,JVM是不能自動回收的。我們需要手動的進(jìn)行資源的回收,此時的資源釋放,就需要放在finally中
使用try-catch 處理編譯時異常,是得程序在編譯時就不報錯,但是運行時仍可報錯。相當(dāng)于我們使用try-catch 將一個編譯時可能出現(xiàn)的異常,延遲到運行時出現(xiàn)。
throws + 異常類型
一旦當(dāng)方法體執(zhí)行時,出現(xiàn)異常,仍會在異常代碼處生成一個異常類的對象,此對象滿足throws后異常類型時,就會被拋出。異常代碼后續(xù)的代碼,就不再執(zhí)行。
try-catch : ?真正的將異常處理掉了
throws: 只是將異常拋給了方法的調(diào)用者。并沒有真正地將異常處理掉。
開發(fā)中如何選擇:
如果父類中被重寫的方法沒有throws方法處理異常,則子類重寫的方法也不能使用throws,意味著如果子類 重寫的方法中有異常,必須使用try-catch
執(zhí)行的方法中,先后又調(diào)用了另外的幾個方法,這幾個方法是遞進(jìn)關(guān)系進(jìn)行的。我們建議這幾個方法使用throws的方式進(jìn)行處理。而執(zhí)行的方法a可以考慮try-catch的方式進(jìn)行處理。
關(guān)于異常對象的產(chǎn)生:
系統(tǒng)自動生成的異常對象
手動的生成一個異常對象,并拋出“throw”
只有異常體系的對象才可以 throew new ?異常類類名 () ;
throw 和 thorws 的區(qū)別 :
throw是拋,throws 是抓
throw 表示拋出一個異常類的對象,生成異常對象的過程。聲明在方法體內(nèi)
throws 屬于異常處理的一種方式,聲明在方法的聲明處