Java 强制类型转换从对象内存角度理解
假设现在有一个父类Father,它里面的变量需要占用1M内存,有一个它的子类Son,里面的变量需要占用0.5M内存,现在通过代码来看看内存的分配情况:
// 系统将分配1M内存
Father f = new Father();
// 系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数,由于s中包含了父类的实例,所以s可以调用父类的方法
Son s = new Son();
// s1指向那1.5M的内存
Son s1 = s;
// 这时f1会指向那1.5M内存中的1M内存,即是说:f1只是指向了s中实例的父类实例对象,所以f1只能调用父类的方法(存储在1M内存中),而不能调用子类的方法(存储在0.5M内存中)
Father f1 = (Father) s;
// 这句代码运行时会报ClassCastException,因为f中只有1M内存,而子类的引用都必须要有1.5M的内存,所以无法转换
Son s2 = (Son) f;
// 这句可以通过运行,这时s3指向那1.5M的内存,由于f1是由s转换过来的,所以它是有1.5M的内存的,只是它指向的只有1M内存
Son s3 = (Son) f1;
作者:Schieber
出处:https://www.cnblogs.com/xiqingbo/p/java-31.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】AI 的力量,开发者的翅膀:欢迎使用 AI 原生开发工具 TRAE
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
· 我的AI自学路线,可能对你有用
· WPF 引用 ASP.NET Core 的 AOT 版本
· 纯 C#实现+AOT 打造的智能PDF目录提取工具 PdfTocExtractor
· C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述-下篇)
· 深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南