我想确切地知道在内存中为对象分配的实际空间。
我试着用一些例子来解释:使用 64 位 JVM,指针大小应该是 8 个字节,所以:
Object singletest = new Object();
将需要 8 个字节来引用对象加上对象的大小Object arraytest = new Object[10];
将需要 8 个字节来引用存储数组的位置加上 8*10 字节来存储数组加上每个对象的大小int singleint = new int;
只需要 2 个字节,因为 int 是原始类型int[] arrayint = new int[10];
将需要 8 个字节来引用位置和 10*2 字节来引用元素
此外,这也是 Java 允许编写如下代码的原因:
int[][] doublearray = new int[2][];
int[0][] = new int[5];
int[1][] = new int[10];
真正发生的是数组会像对象一样产生引用(又名指针),因此在声明时第二维的大小并不重要(并且维度可以不同,它们之间没有联系)。然后占用的空间将是:对doublearray的引用(8 个字节),第一个维度只是对第二个维度的引用,所以其他 8 个字节 * 2(第一个维度大小),最后是 2 个字节 * 5 加上 2 个字节 * 10 .
所以,最后,如果有一个像这样的真实课程:
class Test {
int a, b;
int getA() {return A};
void setA(int a) {this.a = a;}
int getB() {return B};
void setB(int b) {this.b = b;}
}
当我调用 new 进行实例化时,将使用 8 个字节的指针(或将其命名为引用,因为它是 Java)加上 2+2 个字节将整数存储到类中。
问题是:我是对的还是我写的都是废话?此外,当我不实例化一个对象而只是声明它时,是否会分配 8 个字节以供进一步使用?如果我分配一个空值怎么办?
同时对于原始类型,我很确定只要声明它就会分配请求的空间(如果我声明一个“int i”,那么我可以立即调用 i++,因为没有使用引用,只有一部分内存设置为“0” )。
我在互联网上搜索没有聪明的回应......我知道我写了很多问题,但任何帮助将不胜感激!(也许我不是唯一感兴趣的人)