You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中多态、数据类型与内存:多态定义与初始化疑问

关于Java多态中基类引用容纳子类实例的解惑

嘿,这个问题问到点子上了——很多刚接触Java多态的开发者都会有这个误解,核心原因是你混淆了引用变量本身的大小和实际对象实例的大小,咱们一步步说清楚:

  • 首先,Java里的类类型变量(不管是Base还是Sub)本质上都是引用(可以理解为指向堆内存的指针),它本身的大小和类的成员数量完全无关。在64位JVM中,引用变量通常占用8字节;32位JVM里是4字节——这个大小是固定的,只和JVM架构有关,和你定义的类有多少成员一点关系都没有。

  • 真正的对象实例(不管是Base还是Sub的实例)是存储在堆内存里的:Base实例占4字节(仅int x),Sub实例占8字节(int x + int y),这些实例的大小才由类的成员决定。而Base类型的变量,只是存了这个Sub实例在堆里的内存地址,不是把整个Sub实例塞进变量里。

  • 这也是Java多态实现的核心:当你写Base obj = new Sub();时,obj是Base类型的引用,但它指向的是堆里的Sub实例。JVM会在运行时维护每个对象的实际类型信息,所以调用方法时会动态绑定到Sub的实现,这就是所谓的动态多态。

  • 补充一点:只有Java的基本类型变量(比如int、char)才是直接存储值本身,大小由类型决定;所有类类型、数组类型都是引用类型,变量只存地址,对象实例在堆里。

所以根本不是Base类型变量“容纳”了子类实例,而是它指向了堆里的子类实例——这和Java的动态内存分配机制确实有关,但核心是引用和实例的分离存储。

内容的提问来源于stack exchange,提问作者J Lem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:43:02