Java的靜態(tài)類型檢查示例代碼詳解
關(guān)于靜態(tài)類型檢查和動態(tài)類型檢查的解釋:
靜態(tài)類型檢查:基于程序的源代碼來驗證類型安全的過程;
動態(tài)類型檢查:在程序運行期間驗證類型安全的過程;
Java使用靜態(tài)類型檢查在編譯期間分析程序,確保沒有類型錯誤?;镜乃枷胧遣灰岊愋湾e誤在運行期間發(fā)生。
在各色各樣的編程語言中,總共存在著兩個類型檢查機制:靜態(tài)類型檢查和動態(tài)類型檢查。
靜態(tài)類型檢查是指通過對應(yīng)用程序的源碼進行分析,在編譯期間就保證程序的類型安全。
動態(tài)類型檢查是在程序的運行過程中,驗證程序的類型安全。在Java中,編譯期間使用靜態(tài)類型檢查機制分析Java源代碼,可以提前發(fā)現(xiàn)Java中類型缺少的錯誤。這個機制的好處是,不讓錯誤的事情在運行時才被發(fā)現(xiàn)。本文,將使用幾個代碼示例,深入講解Java中的類型檢查機制。一旦完全理解了本文的例子,就完全掌握了Java中的靜態(tài)類型檢查。
深入分析Java的靜態(tài)類型檢查
代碼示例
假設(shè)我們有如下的兩個類,類Super 和 類Suber,而且他們具有如下繼承關(guān)系:
class Super {
Super me() {
return this;
}
public void doSuper() {
System.out.println("www.tiantianbianma.com");
}
}
class Suber extends Super {
public void doSuber() {
System.out.println("天天編碼");
}
}
首先,思考這個問題:”new Suber().me()” 的返回值是什么? 是一個 Super對象 還是一個 Suber對象?
這個 me() 方法被聲明為返回一個 Super對象,所以,在編譯期間,編譯期認(rèn)為它返回的是一個 Super對象。但是,在運行期間,該語句實際返回的是一個 Suber對象,因為 Suber繼承了Super的me()方法,并返回了自身對象(多態(tài)性)。
靜態(tài)檢查
我們來看看常見的錯誤示例代碼:
// 錯誤 new Suber().me().doSuber();
這個語句在編譯時會報錯,雖然 “new Suber().me()” 返回的結(jié)果,本質(zhì)上是一個 Suber對象,Suber對象確實也具有 doSuber() 方法。但是,在編譯器看來,”new Suber().me()” 返回結(jié)果的引用類型是 Super,自然不能在Super類型的引用上調(diào)用該類型沒有定義的 doSuber() 方法。所以,我們可以改成如下的正確形式:
// 正確 new Suber().me().doSuper();
另外,既然 “new Suber().me()” 返回的結(jié)果確實是一個 Suber對象,如果想調(diào)用其特有的方法,我們可以使用強制類型轉(zhuǎn)換來完成功能:
// 正確 ((Suber) new Suber().me()).doSuber();
深入擴展
現(xiàn)在,假設(shè)我們增加了一個如下所示的類:Brother
class Brother extends Super{
public void doBad() {
System.out.println("好好學(xué)習(xí)");
}
}
那么,大家思考一下如下的語句:
// 正確 ((Brother) new Suber().me()).beBad();
這個語句真的是正確的嗎?實際上,該語句確實可以通過靜態(tài)類型檢查和正確編譯。畢竟,編譯器不知道 “new Suber().me()” 的實際類型。但是,該語句在運行時出拋出如下的錯誤:
java.lang.ClassCastException: Suber cannot be cast to Brother
原因很簡單,兩個不存在任何繼承關(guān)系的類(Suber和Brother)不可以做類型轉(zhuǎn)換。
總結(jié)
以上所述是小編給大家介紹的Java的靜態(tài)類型檢查示例代碼詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
詳解Java Callable接口實現(xiàn)多線程的方式
這篇文章主要介紹了詳解Java Callable接口實現(xiàn)多線程的方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Visual?Studio?Code配置Tomcat運行Java?Web項目詳細步驟
VS Code是一款非常棒的文本編輯器,具有配置簡單、功能豐富、輕量簡潔的特點,并且極其適合處理中小規(guī)模的代碼,這篇文章主要給大家介紹了關(guān)于Visual?Studio?Code配置Tomcat運行Java?Web項目的詳細步驟,需要的朋友可以參考下2023-11-11
java?HttpURLConnection類的disconnect方法與http長連接詳解
這篇文章主要介紹了java?HttpURLConnection類的disconnect方法與http長連接,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式
這篇文章主要介紹了JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Java 中Comparable和Comparator區(qū)別比較
本文,先介紹Comparable 和Comparator兩個接口,以及它們的差異;接著,通過示例,對它們的使用方法進行說明2013-09-09
Java OpenCV4.0.0實現(xiàn)實時人臉識別
這篇文章主要為大家詳細介紹了Java OpenCV4.0.0實現(xiàn)實時人臉識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07

