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
相关产品推荐
相关产品推荐

