Java、計算機、編程、程序員
吐槽
面試官:Java的向上轉型和向下轉型解釋下
程序汪:我知道怎麼用,不知道為啥哦
面試官:你可以回家等消息了
程序汪:涼涼的感覺
基礎準備
- 動態綁定
- 繼承
- 接口
- 強制轉換
- 父類引用指向子類實現
繼承
Java裡繼承是代碼複用的機制,子類繼承了父類的非私有屬性和方法,然後子類又可以繼續擴展自己的屬性及方法。
向上轉型(自動)
子類對象轉為父類,父類可以是接口。公式:Father f = new Son();Father是父類或接口,son是子類。
通俗講:兒子升級變老子了,就只能用老子的方法了,兒子的方法就不能調用了,你要調用JVM老大會報錯給你看,哈哈哈
老子就一個,兒子可以有很多。
向下轉型(強制)
強制轉換 必須 (類型)父類
父類對象轉為子類。公式:Son s = (Son)f;
向下轉型需要考慮安全性,如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤即能否向下轉型,只有先經過向上轉型的對象才能繼續向下轉型。
通俗講:老子如果想變兒子,需要用instanceof安全驗證下,不然有可能異常(不是親生的就慘了)ClassCastException,注意只有兒子升級到老子,然後老子才能降級到兒子。
HashMap源碼的向下轉型
Java、計算機、編程、程序員
吐槽
面試官:Java的向上轉型和向下轉型解釋下
程序汪:我知道怎麼用,不知道為啥哦
面試官:你可以回家等消息了
程序汪:涼涼的感覺
基礎準備
- 動態綁定
- 繼承
- 接口
- 強制轉換
- 父類引用指向子類實現
繼承
Java裡繼承是代碼複用的機制,子類繼承了父類的非私有屬性和方法,然後子類又可以繼續擴展自己的屬性及方法。
向上轉型(自動)
子類對象轉為父類,父類可以是接口。公式:Father f = new Son();Father是父類或接口,son是子類。
通俗講:兒子升級變老子了,就只能用老子的方法了,兒子的方法就不能調用了,你要調用JVM老大會報錯給你看,哈哈哈
老子就一個,兒子可以有很多。
向下轉型(強制)
強制轉換 必須 (類型)父類
父類對象轉為子類。公式:Son s = (Son)f;
向下轉型需要考慮安全性,如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤即能否向下轉型,只有先經過向上轉型的對象才能繼續向下轉型。
通俗講:老子如果想變兒子,需要用instanceof安全驗證下,不然有可能異常(不是親生的就慘了)ClassCastException,注意只有兒子升級到老子,然後老子才能降級到兒子。
HashMap源碼的向下轉型
String源碼裡的向下轉型
Java、計算機、編程、程序員
吐槽
面試官:Java的向上轉型和向下轉型解釋下
程序汪:我知道怎麼用,不知道為啥哦
面試官:你可以回家等消息了
程序汪:涼涼的感覺
基礎準備
- 動態綁定
- 繼承
- 接口
- 強制轉換
- 父類引用指向子類實現
繼承
Java裡繼承是代碼複用的機制,子類繼承了父類的非私有屬性和方法,然後子類又可以繼續擴展自己的屬性及方法。
向上轉型(自動)
子類對象轉為父類,父類可以是接口。公式:Father f = new Son();Father是父類或接口,son是子類。
通俗講:兒子升級變老子了,就只能用老子的方法了,兒子的方法就不能調用了,你要調用JVM老大會報錯給你看,哈哈哈
老子就一個,兒子可以有很多。
向下轉型(強制)
強制轉換 必須 (類型)父類
父類對象轉為子類。公式:Son s = (Son)f;
向下轉型需要考慮安全性,如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤即能否向下轉型,只有先經過向上轉型的對象才能繼續向下轉型。
通俗講:老子如果想變兒子,需要用instanceof安全驗證下,不然有可能異常(不是親生的就慘了)ClassCastException,注意只有兒子升級到老子,然後老子才能降級到兒子。
HashMap源碼的向下轉型
String源碼裡的向下轉型
SpringMVC源碼(向上轉型)
向下轉型經典代碼
方法入參是 接口ApplicationContext,具體初始化類在不用的init方法中
org.springframework.web.servlet.DispatcherServlet
如果不用接口,直接用子類入參,這個代碼會有多臃腫啊,那畫面不敢想啊。
Java、計算機、編程、程序員
吐槽
面試官:Java的向上轉型和向下轉型解釋下
程序汪:我知道怎麼用,不知道為啥哦
面試官:你可以回家等消息了
程序汪:涼涼的感覺
基礎準備
- 動態綁定
- 繼承
- 接口
- 強制轉換
- 父類引用指向子類實現
繼承
Java裡繼承是代碼複用的機制,子類繼承了父類的非私有屬性和方法,然後子類又可以繼續擴展自己的屬性及方法。
向上轉型(自動)
子類對象轉為父類,父類可以是接口。公式:Father f = new Son();Father是父類或接口,son是子類。
通俗講:兒子升級變老子了,就只能用老子的方法了,兒子的方法就不能調用了,你要調用JVM老大會報錯給你看,哈哈哈
老子就一個,兒子可以有很多。
向下轉型(強制)
強制轉換 必須 (類型)父類
父類對象轉為子類。公式:Son s = (Son)f;
向下轉型需要考慮安全性,如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤即能否向下轉型,只有先經過向上轉型的對象才能繼續向下轉型。
通俗講:老子如果想變兒子,需要用instanceof安全驗證下,不然有可能異常(不是親生的就慘了)ClassCastException,注意只有兒子升級到老子,然後老子才能降級到兒子。
HashMap源碼的向下轉型
String源碼裡的向下轉型
SpringMVC源碼(向上轉型)
向下轉型經典代碼
方法入參是 接口ApplicationContext,具體初始化類在不用的init方法中
org.springframework.web.servlet.DispatcherServlet
如果不用接口,直接用子類入參,這個代碼會有多臃腫啊,那畫面不敢想啊。
SpringMVC源碼的向下轉型
Java、計算機、編程、程序員
吐槽
面試官:Java的向上轉型和向下轉型解釋下
程序汪:我知道怎麼用,不知道為啥哦
面試官:你可以回家等消息了
程序汪:涼涼的感覺
基礎準備
- 動態綁定
- 繼承
- 接口
- 強制轉換
- 父類引用指向子類實現
繼承
Java裡繼承是代碼複用的機制,子類繼承了父類的非私有屬性和方法,然後子類又可以繼續擴展自己的屬性及方法。
向上轉型(自動)
子類對象轉為父類,父類可以是接口。公式:Father f = new Son();Father是父類或接口,son是子類。
通俗講:兒子升級變老子了,就只能用老子的方法了,兒子的方法就不能調用了,你要調用JVM老大會報錯給你看,哈哈哈
老子就一個,兒子可以有很多。
向下轉型(強制)
強制轉換 必須 (類型)父類
父類對象轉為子類。公式:Son s = (Son)f;
向下轉型需要考慮安全性,如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤即能否向下轉型,只有先經過向上轉型的對象才能繼續向下轉型。
通俗講:老子如果想變兒子,需要用instanceof安全驗證下,不然有可能異常(不是親生的就慘了)ClassCastException,注意只有兒子升級到老子,然後老子才能降級到兒子。
HashMap源碼的向下轉型
String源碼裡的向下轉型
SpringMVC源碼(向上轉型)
向下轉型經典代碼
方法入參是 接口ApplicationContext,具體初始化類在不用的init方法中
org.springframework.web.servlet.DispatcherServlet
如果不用接口,直接用子類入參,這個代碼會有多臃腫啊,那畫面不敢想啊。
SpringMVC源碼的向下轉型
吐槽
java幹嘛搞個向上向下轉型,這麼麻煩直接Son s = new Son()不是很爽嘛,
這就是複雜業務代碼沒遇到過才這麼問
總結
- 向上轉型的作用,減少重複代碼,父類為參數,調有時用子類作為參數,就是利用了向上轉型。這樣使代碼變得簡潔。體現了JAVA的抽象編程思想
- 框架代碼中骨架代碼都是靠向上向下轉型來讓代碼複用達到極致;