Java的靜態(tài)類型檢查示例代碼詳解
關(guān)于靜態(tài)類型檢查和動(dòng)態(tài)類型檢查的解釋:
靜態(tài)類型檢查:基于程序的源代碼來驗(yàn)證類型安全的過程;
動(dòng)態(tài)類型檢查:在程序運(yùn)行期間驗(yàn)證類型安全的過程;
Java使用靜態(tài)類型檢查在編譯期間分析程序,確保沒有類型錯(cuò)誤。基本的思想是不要讓類型錯(cuò)誤在運(yùn)行期間發(fā)生。
在各色各樣的編程語言中,總共存在著兩個(gè)類型檢查機(jī)制:靜態(tài)類型檢查和動(dòng)態(tài)類型檢查。
靜態(tài)類型檢查是指通過對(duì)應(yīng)用程序的源碼進(jìn)行分析,在編譯期間就保證程序的類型安全。
動(dòng)態(tài)類型檢查是在程序的運(yùn)行過程中,驗(yàn)證程序的類型安全。在Java中,編譯期間使用靜態(tài)類型檢查機(jī)制分析Java源代碼,可以提前發(fā)現(xiàn)Java中類型缺少的錯(cuò)誤。這個(gè)機(jī)制的好處是,不讓錯(cuò)誤的事情在運(yùn)行時(shí)才被發(fā)現(xiàn)。本文,將使用幾個(gè)代碼示例,深入講解Java中的類型檢查機(jī)制。一旦完全理解了本文的例子,就完全掌握了Java中的靜態(tài)類型檢查。
深入分析Java的靜態(tài)類型檢查
代碼示例
假設(shè)我們有如下的兩個(gè)類,類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("天天編碼"); } }
首先,思考這個(gè)問題:”new Suber().me()” 的返回值是什么? 是一個(gè) Super對(duì)象 還是一個(gè) Suber對(duì)象?
這個(gè) me() 方法被聲明為返回一個(gè) Super對(duì)象,所以,在編譯期間,編譯期認(rèn)為它返回的是一個(gè) Super對(duì)象。但是,在運(yùn)行期間,該語句實(shí)際返回的是一個(gè) Suber對(duì)象,因?yàn)?Suber繼承了Super的me()方法,并返回了自身對(duì)象(多態(tài)性)。
靜態(tài)檢查
我們來看看常見的錯(cuò)誤示例代碼:
// 錯(cuò)誤 new Suber().me().doSuber();
這個(gè)語句在編譯時(shí)會(huì)報(bào)錯(cuò),雖然 “new Suber().me()
” 返回的結(jié)果,本質(zhì)上是一個(gè) Suber對(duì)象,Suber對(duì)象確實(shí)也具有 doSuber() 方法。但是,在編譯器看來,”new Suber().me()” 返回結(jié)果的引用類型是 Super,自然不能在Super類型的引用上調(diào)用該類型沒有定義的 doSuber() 方法。所以,我們可以改成如下的正確形式:
// 正確 new Suber().me().doSuper();
另外,既然 “new Suber().me()
” 返回的結(jié)果確實(shí)是一個(gè) Suber對(duì)象,如果想調(diào)用其特有的方法,我們可以使用強(qiáng)制類型轉(zhuǎn)換來完成功能:
// 正確 ((Suber) new Suber().me()).doSuber();
深入擴(kuò)展
現(xiàn)在,假設(shè)我們?cè)黾恿艘粋€(gè)如下所示的類:Brother
class Brother extends Super{ public void doBad() { System.out.println("好好學(xué)習(xí)"); } }
那么,大家思考一下如下的語句:
// 正確 ((Brother) new Suber().me()).beBad();
這個(gè)語句真的是正確的嗎?實(shí)際上,該語句確實(shí)可以通過靜態(tài)類型檢查和正確編譯。畢竟,編譯器不知道 “new Suber().me()”
的實(shí)際類型。但是,該語句在運(yùn)行時(shí)出拋出如下的錯(cuò)誤:
java.lang.ClassCastException: Suber cannot be cast to Brother
原因很簡(jiǎn)單,兩個(gè)不存在任何繼承關(guān)系的類(Suber和Brother)不可以做類型轉(zhuǎn)換。
總結(jié)
以上所述是小編給大家介紹的Java的靜態(tài)類型檢查示例代碼詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot停止啟動(dòng)時(shí)測(cè)試檢查rabbitmq操作
這篇文章主要介紹了SpringBoot停止啟動(dòng)時(shí)測(cè)試檢查rabbitmq操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java實(shí)現(xiàn)簡(jiǎn)單的遞歸操作方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)簡(jiǎn)單的遞歸操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02關(guān)于MVC的dao層、service層和controller層詳解
這篇文章主要介紹了關(guān)于MVC的dao層、service層和controller層詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02IDEA?database和datagrip無法下載驅(qū)動(dòng)問題解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA?database和datagrip無法下載驅(qū)動(dòng)問題的解決辦法,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用idea具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-03-03SpringBoot中的WebSocketSession原理詳解
這篇文章主要介紹了SpringBoot中的WebSocketSession原理詳解,傳統(tǒng)的?HTTP?協(xié)議是無法支持實(shí)時(shí)通信的,因?yàn)樗且环N無狀態(tài)協(xié)議,每次請(qǐng)求都是獨(dú)立的,無法保持連接。為了解決這個(gè)問題,WebSocket?協(xié)議被引入,需要的朋友可以參考下2023-07-07java中Hutool工具類的常見使用場(chǎng)景詳解
在日常開發(fā)中,我們會(huì)使用很多工具類來提升項(xiàng)目開發(fā)的速度,而國(guó)內(nèi)用的比較多的 Hutool 框架,就是其中之一,本文我們就來介紹一下Hutool的具體使用吧2023-12-12使用Post方法模擬登陸爬取網(wǎng)頁的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄褂肞ost方法模擬登陸爬取網(wǎng)頁的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03