欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java強制類型轉(zhuǎn)換原理詳解(父類轉(zhuǎn)子類、子類轉(zhuǎn)父類)

 更新時間:2023年12月27日 15:33:01   作者:lucky_fd_  
這篇文章主要給大家介紹了關于Java強制類型轉(zhuǎn)換原理(父類轉(zhuǎn)子類、子類轉(zhuǎn)父類)的相關資料,所謂的強制類型轉(zhuǎn)換,其實是自動類型轉(zhuǎn)換的逆過程,在數(shù)據(jù)類型兼容的情況下,將容量大的數(shù)據(jù)類型轉(zhuǎn)換為容量小的數(shù)據(jù)類型,需要的朋友可以參考下

前言

在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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • IDEA中thymeleaf語法沒有提示的問題及解決

    IDEA中thymeleaf語法沒有提示的問題及解決

    這篇文章主要介紹了IDEA中thymeleaf語法沒有提示的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot請求響應方式示例詳解

    SpringBoot請求響應方式示例詳解

    這篇文章主要介紹了SpringBoot請求響應的相關操作,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • 關于SpringBoot整合RabbitMQ實現(xiàn)死信隊列

    關于SpringBoot整合RabbitMQ實現(xiàn)死信隊列

    這篇文章主要介紹了關于SpringBoot整合RabbitMQ實現(xiàn)死信隊列,死信隊列實際上就是一個普通的隊列,只是這個隊列跟死信交換機進行了綁定,用來存放死信而已,需要的朋友可以參考下
    2023-05-05
  • JAVA發(fā)送HTTP請求的多種方式詳細總結(jié)

    JAVA發(fā)送HTTP請求的多種方式詳細總結(jié)

    目前做項目中有一個需求是這樣的,需要通過Java發(fā)送url請求,查看該url是否有效,這時我們可以通過獲取狀態(tài)碼來判斷,下面這篇文章主要給大家介紹了關于JAVA發(fā)送HTTP請求的多種方式總結(jié)的相關資料,需要的朋友可以參考下
    2023-01-01
  • Java介紹多線程計算階乘實現(xiàn)方法

    Java介紹多線程計算階乘實現(xiàn)方法

    這篇文章主要為大家詳細介紹了Java多線程計算階乘的實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • springboot線程池監(jiān)控的簡單實現(xiàn)

    springboot線程池監(jiān)控的簡單實現(xiàn)

    本文主要介紹了springboot線程池監(jiān)控的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Springboot核心機制詳細介紹

    Springboot核心機制詳細介紹

    SpringBoot的核心機制包括自動配置、起步依賴、主類和運行器、以及嵌入式服務器等,通過這些機制,SpringBoot簡化了應用開發(fā)過程,本文給大家介紹Springboot核心機制,感興趣的朋友一起看看吧
    2024-11-11
  • 設計模式系列之組合模式及其在JDK和MyBatis源碼中的運用詳解

    設計模式系列之組合模式及其在JDK和MyBatis源碼中的運用詳解

    這篇文章主要介紹了組合模式及其在JDK和MyBatis源碼中的運用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java去除字符串中空格的方法詳解

    Java去除字符串中空格的方法詳解

    這篇文章主要介紹了Java去除字符串中空格的方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • mybatis的ParamNameResolver參數(shù)名稱解析

    mybatis的ParamNameResolver參數(shù)名稱解析

    這篇文章主要為大家介紹了mybatis的ParamNameResolver參數(shù)名稱解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論