我现在是java的初学者,对某些概念感到困惑。
假设有一个父类和一个子类。方法在两者之间被覆盖。如果我这样做:
Parent p = new Child();
究竟是如何为对象分配内存的?假设父类的内存为 32 个字节,子类有 2 个字节,使其为 34 个字节。
那么 32 字节究竟是如何Parent容纳 34 字节的Child呢?
我现在是java的初学者,对某些概念感到困惑。
假设有一个父类和一个子类。方法在两者之间被覆盖。如果我这样做:
Parent p = new Child();
究竟是如何为对象分配内存的?假设父类的内存为 32 个字节,子类有 2 个字节,使其为 34 个字节。
那么 32 字节究竟是如何Parent容纳 34 字节的Child呢?
为了得到这个问题,你需要了解数据是如何存储在内存中的。
当您声明原始数据类型的变量时,内存将为该数据分配存储空间。如果您为该变量分配值,则该值将存储在该空间中。 看图片
对象不同。当你声明一个B类的对象变量时,例如:“B obj_var;”
内存将分配一个空间内存来将地址保存到具有 B 的类属性的对象(同一类或扩展 A 的类)。如果您只是声明变量,它将包含一个 null 值。
当您创建一个对象时,例如:“new B()”,该对象将在内存中创建并被赋予一个地址。在这种情况下,您不保存地址,因此您无法访问或重用该对象。
如果你写“B obj_var = new B();”,你会同时做 3 件事: 1- 在左侧创建一个对象变量。2- 在右侧创建一个对象。3-将对象的地址赋给对象变量,这样对象的地址就保存在对象变量中。 查看 您访问以下链接的图像以了解有关数据如何存储在内存中的更多信息: https ://www.guru99.com/java-stack-heap.html
所以你的问题的答案是,当你输入“Parent p”时,内存会为一个地址分配一个空间,所以它的大小将与计算机需要多少字节来表示一个地址,而不是类。当您键入“new Child()”时,子类的对象将以自己的大小创建。由于 Child 类是 Parent 类的子类,我们可以通过 Parent 类的对象变量“Parent p = new Child();”来引用 Child 类。
它不是存储在其父对象中的对象,而是存储在其对象变量中的对象地址。