Java面試官:請說下java向上轉型和向下轉型 程序汪:不清楚啊

Java、計算機、編程、程序員

吐槽

面試官:Java的向上轉型和向下轉型解釋下

程序汪:我知道怎麼用,不知道為啥哦

面試官:你可以回家等消息了

程序汪:涼涼的感覺

基礎準備

  1. 動態綁定
  2. 繼承
  3. 接口
  4. 強制轉換
  5. 父類引用指向子類實現

繼承

Java裡繼承是代碼複用的機制,子類繼承了父類的非私有屬性和方法,然後子類又可以繼續擴展自己的屬性及方法。

向上轉型(自動)

子類對象轉為父類,父類可以是接口。公式:Father f = new Son();Father是父類或接口,son是子類。

通俗講:兒子升級變老子了,就只能用老子的方法了,兒子的方法就不能調用了,你要調用JVM老大會報錯給你看,哈哈哈

老子就一個,兒子可以有很多。

向下轉型(強制)

強制轉換 必須 (類型)父類

父類對象轉為子類。公式:Son s = (Son)f;

向下轉型需要考慮安全性,如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤即能否向下轉型,只有先經過向上轉型的對象才能繼續向下轉型。

通俗講:老子如果想變兒子,需要用instanceof安全驗證下,不然有可能異常(不是親生的就慘了)ClassCastException,注意只有兒子升級到老子,然後老子才能降級到兒子

HashMap源碼的向下轉型

Java面試官:請說下java向上轉型和向下轉型 程序汪:不清楚啊

String源碼裡的向下轉型

Java面試官:請說下java向上轉型和向下轉型 程序汪:不清楚啊

SpringMVC源碼(向上轉型)

向下轉型經典代碼

方法入參是 接口ApplicationContext,具體初始化類在不用的init方法中

org.springframework.web.servlet.DispatcherServlet

如果不用接口,直接用子類入參,這個代碼會有多臃腫啊,那畫面不敢想啊。

Java面試官:請說下java向上轉型和向下轉型 程序汪:不清楚啊

SpringMVC源碼的向下轉型

Java面試官:請說下java向上轉型和向下轉型 程序汪:不清楚啊

吐槽

java幹嘛搞個向上向下轉型,這麼麻煩直接Son s = new Son()不是很爽嘛,

這就是複雜業務代碼沒遇到過才這麼問

總結

  • 向上轉型的作用,減少重複代碼,父類為參數,調有時用子類作為參數,就是利用了向上轉型。這樣使代碼變得簡潔。體現了JAVA的抽象編程思想
  • 框架代碼中骨架代碼都是靠向上向下轉型來讓代碼複用達到極致;


分享到:


相關文章: