Java 强制类型转换原理(父类转子类、子类转父类)

这篇具有很好参考价值的文章主要介绍了Java 强制类型转换原理(父类转子类、子类转父类)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Java中,对象的强制转换(也称为类型转换)是将一个对象的引用转换为另一个类的引用,前提是这两个类之间存在继承或实现关系。强制转换可能会导致运行时异常,因为在转换的过程中,如果对象的实际类型与转换的目标类型不兼容,就会抛出ClassCastException异常。

子类转父类

Son s = new Son();
// 类型提升
Father f = (Father)s;//可以

分析: 子类继承父类,就拥有了父类的一切。某种程度上说,儿子可以代替爸爸,爸爸能做的事儿子也可以做。子类转父类后,父类对象f引用指向子类对象,所以其本质任然是子类,f只能调用父类的方法,如果子类重写了父类的方法,则调用的是子类的方法(多态性)

父类转子类

1. 真实父类对象转子类对象,报ClassCastException异常

Father f = new Father();
Son s = (Son)f;//出错 ClassCastException

分析: 创建一个父类的实例,想要强制把父类对象转换成子类的对象,是不行的。父亲有的,通过继承儿子也有,反过来儿子有的父亲却不一定有。

2. “假”父类对象转子类对象,可以

Father f = new Son();
Son s = (Son)f;//可以

分析:只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象。这个时候父类的本质依然是子类对象(儿子只是装成了爸爸),子类有的属性f都拥有,只是f暂时不能操作子类特有的属性,所以可以转换回为子类对象(变回儿子本身)

底层实现原理

底层原理是通过虚拟机中的类型检查和类型信息来实现的。当进行强制类型转换时,虚拟机会在运行时检查对象的实际类型是否与转换的目标类型兼容。如果是兼容的,就会将对象引用转换为目标类型的引用,否则会抛出ClassCastException异常。

在Java中,对象的类型信息是通过两种主要机制来处理的:对象头和虚方法表。

  1. 对象头:每个Java对象都有一个对象头,其中包含了一些用于虚拟机处理对象的元数据。对象头中包含了一个指向类元数据的指针(指向对象的类的信息)。这使得虚拟机可以在运行时确定对象的实际类型。

  2. 虚方法表:对于每个类,Java虚拟机会维护一个虚方法表,其中包含了类的虚方法的地址。虚方法表允许在运行时动态地解析方法调用,而不是在编译时静态地绑定。通过虚方法表,Java虚拟机可以找到并调用对象的实际方法。

在进行强制类型转换时,虚拟机会首先检查对象头中指向类元数据的指针,然后查找目标类型的类信息。如果目标类型是源类型的子类(或实现了源类型的接口),那么转换是有效的。虚拟机会根据实际类型来调整对象引用的指针,使其指向目标类型的类信息和虚方法表,从而实现类型转换。

然而,如果目标类型不是源类型的子类(或未实现源类型的接口),虚拟机将无法进行有效的转换,这时会抛出ClassCastException异常。

总结:Java对象的强制类型转换是通过虚拟机在运行时检查对象的实际类型,并根据类型信息来调整对象引用的指针来实现的。这样的机制使得Java具有动态类型的特性,但也需要开发人员在进行类型转换时注意类型的兼容性,以避免ClassCastException异常。文章来源地址https://www.toymoban.com/news/detail-734521.html

到了这里,关于Java 强制类型转换原理(父类转子类、子类转父类)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实现数据类型的强制转换

    在 Java 中,数据类型的强制转换可以使用小括号括起来的目标数据类型来实现。例如,要将一个 int 类型的变量强制转换为 double 类型,可以使用如下代码: 注意,强制转换可能会导致精度损失或溢出,因此应谨慎使用。 此外,Java 还提供了自动类型转换的机制,即在没有损

    2024年02月14日
    浏览(37)
  • java子类继承父类方法、或者接口中方法的javadoc注释

    详情可以阅读: https://docs.oracle.com/en/java/javase/19/docs/specs/javadoc/doc-comment-spec.html#method-comment-inheritance 子类继承父类、或者子类实现接口,在子类中为了避免重复写注释,可以在子类方法注释的主要描述部分、或者@return、@param、@throws标记后面的文本参数部分插入{@inheritDoc}标记

    2024年02月11日
    浏览(30)
  • java之“强制数据类型转换与数据溢出”

    本文以byte类型相加运算来做“强制数据类型转换与数据溢出”的示例。

    2024年02月04日
    浏览(37)
  • 链式-父类中返回子类对象

    一晃五年没写博客了,依旧再C#上耕耘,依旧没有啥建树,现在也不知道.net上还有多少人再使用,在这里分享一些自己觉得写的还算优雅的代码。 对于自己写着完的代码,我特别喜欢链式(来源于jQuery的影响吧),大部分时候链式就是将返回值为void类型的对象,返回this指针

    2024年02月05日
    浏览(26)
  • C++ | 继承(基类,父类,超类),(派生类,子类)

    文章参考:https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类.  2.在C++中使用: 冒号表示继承,如class A : public B;表示派生类A从基类B继承而来 3.派生类包含基类的所有

    2024年02月15日
    浏览(28)
  • 【C/C++】父类指针指向子类对象 | 隐藏

    创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡𖥦)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c++系列专栏:C/C++零基础到精通 🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ c语言内容💖:

    2024年02月11日
    浏览(31)
  • c++和QT子类调用父类方法

    c++调用方式 : 父类名::方法名 QT调用方式 : __super::方法

    2024年02月13日
    浏览(35)
  • C# 中什么是重写(子类改写父类方法)

    方法重写是指在继承关系中,子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中,方法重写是一种多态的表现形式,它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重写的基本规则如下:

    2024年02月09日
    浏览(41)
  • C++强制类型转换

    static_cast 是 C++ 中的一种显式类型转换运算符。 它可以将一个表达式强制转换为指定的类型,并且是静态类型转换,因此不会执行任何运行时类型检查。如果类型转换不合法,则程序可能出现未定义的行为。因此,使用 static_cast 要特别小心,确保类型转换的合法性。 格式

    2024年02月07日
    浏览(54)
  • Python的强制类型转换

            如果想像C语言那样,在Python中,字节数组(bytes)可以通过标准库中的 struct 模块来进行解包(unpack)成为一个结构体,也可以将一个结构体打包(pack)成为一个字节数组。这个过程类似于C语言中的强制类型转换,但并不是完全相同的概念。 struct 模块提供了一些

    2023年04月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包