Java強制類型轉(zhuǎn)換原理詳解(父類轉(zhuǎn)子類、子類轉(zhuǎn)父類)
前言
在Java中,對象的強制轉(zhuǎn)換(也稱為類型轉(zhuǎn)換)是將一個對象的引用轉(zhuǎn)換為另一個類的引用,前提是這兩個類之間存在繼承或?qū)崿F(xiàn)關系。強制轉(zhuǎn)換可能會導致運行時異常,因為在轉(zhuǎn)換的過程中,如果對象的實際類型與轉(zhuǎn)換的目標類型不兼容,就會拋出ClassCastException異常。
子類轉(zhuǎn)父類
Son s = new Son(); // 類型提升 Father f = (Father)s;//可以
分析: 子類繼承父類,就擁有了父類的一切。某種程度上說,兒子可以代替爸爸,爸爸能做的事兒子也可以做。子類轉(zhuǎn)父類后,父類對象f引用指向子類對象,所以其本質(zhì)任然是子類,f只能調(diào)用父類的方法,如果子類重寫了父類的方法,則調(diào)用的是子類的方法(多態(tài)性)
父類轉(zhuǎn)子類
1. 真實父類對象轉(zhuǎn)子類對象,報ClassCastException異常
Father f = new Father(); Son s = (Son)f;//出錯 ClassCastException
分析: 創(chuàng)建一個父類的實例,想要強制把父類對象轉(zhuǎn)換成子類的對象,是不行的。父親有的,通過繼承兒子也有,反過來兒子有的父親卻不一定有。
2. “假”父類對象轉(zhuǎn)子類對象,可以
Father f = new Son(); Son s = (Son)f;//可以
分析:只有父類對象本身就是用子類new出來的時候, 才可以在將來被強制轉(zhuǎn)換為子類對象。這個時候父類的本質(zhì)依然是子類對象(兒子只是裝成了爸爸),子類有的屬性f都擁有,只是f暫時不能操作子類特有的屬性,所以可以轉(zhuǎn)換回為子類對象(變回兒子本身)
底層實現(xiàn)原理
底層原理是通過虛擬機中的類型檢查和類型信息來實現(xiàn)的。當進行強制類型轉(zhuǎn)換時,虛擬機會在運行時檢查對象的實際類型是否與轉(zhuǎn)換的目標類型兼容。如果是兼容的,就會將對象引用轉(zhuǎn)換為目標類型的引用,否則會拋出ClassCastException異常。
在Java中,對象的類型信息是通過兩種主要機制來處理的:對象頭和虛方法表。
對象頭:每個Java對象都有一個對象頭,其中包含了一些用于虛擬機處理對象的元數(shù)據(jù)。對象頭中包含了一個指向類元數(shù)據(jù)的指針(指向?qū)ο蟮念惖男畔ⅲ?。這使得虛擬機可以在運行時確定對象的實際類型。
虛方法表:對于每個類,Java虛擬機會維護一個虛方法表,其中包含了類的虛方法的地址。虛方法表允許在運行時動態(tài)地解析方法調(diào)用,而不是在編譯時靜態(tài)地綁定。通過虛方法表,Java虛擬機可以找到并調(diào)用對象的實際方法。
在進行強制類型轉(zhuǎn)換時,虛擬機會首先檢查對象頭中指向類元數(shù)據(jù)的指針,然后查找目標類型的類信息。如果目標類型是源類型的子類(或?qū)崿F(xiàn)了源類型的接口),那么轉(zhuǎn)換是有效的。虛擬機會根據(jù)實際類型來調(diào)整對象引用的指針,使其指向目標類型的類信息和虛方法表,從而實現(xiàn)類型轉(zhuǎn)換。
然而,如果目標類型不是源類型的子類(或未實現(xiàn)源類型的接口),虛擬機將無法進行有效的轉(zhuǎn)換,這時會拋出ClassCastException異常。
總結(jié):Java對象的強制類型轉(zhuǎn)換是通過虛擬機在運行時檢查對象的實際類型,并根據(jù)類型信息來調(diào)整對象引用的指針來實現(xiàn)的。這樣的機制使得Java具有動態(tài)類型的特性,但也需要開發(fā)人員在進行類型轉(zhuǎn)換時注意類型的兼容性,以避免ClassCastException異常。
總結(jié)
到此這篇關于Java強制類型轉(zhuǎn)換原理的文章就介紹到這了,更多相關Java強制類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于SpringBoot整合RabbitMQ實現(xiàn)死信隊列
這篇文章主要介紹了關于SpringBoot整合RabbitMQ實現(xiàn)死信隊列,死信隊列實際上就是一個普通的隊列,只是這個隊列跟死信交換機進行了綁定,用來存放死信而已,需要的朋友可以參考下2023-05-05JAVA發(fā)送HTTP請求的多種方式詳細總結(jié)
目前做項目中有一個需求是這樣的,需要通過Java發(fā)送url請求,查看該url是否有效,這時我們可以通過獲取狀態(tài)碼來判斷,下面這篇文章主要給大家介紹了關于JAVA發(fā)送HTTP請求的多種方式總結(jié)的相關資料,需要的朋友可以參考下2023-01-01springboot線程池監(jiān)控的簡單實現(xiàn)
本文主要介紹了springboot線程池監(jiān)控的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01設計模式系列之組合模式及其在JDK和MyBatis源碼中的運用詳解
這篇文章主要介紹了組合模式及其在JDK和MyBatis源碼中的運用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09mybatis的ParamNameResolver參數(shù)名稱解析
這篇文章主要為大家介紹了mybatis的ParamNameResolver參數(shù)名稱解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08