我举几个例子来解释:在使用64位JVM时,指针大小应为8字节,因此:
- 对象singletest = new Object(); 将花费8字节来引用对象加上对象本身的大小 - 对象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;}
}
当我调用一个新的实例化来生成一个指针(或者称为引用,因为这是Java),会使用8字节的空间加上2+2字节的空间将整数存储到类中。
问题是:我是正确的还是完全胡说八道?此外,当我不实例化对象,只是声明它时,是否会为进一步使用分配8字节的空间?如果我赋予它null值呢?
与此同时,对于原始类型,我很确定只是声明就会分配请求的空间(如果我声明一个“int i”,那么我可以立即调用i++,因为没有使用引用,只是在“0”上设置了一部分内存)。
我在网上搜索没有得到明确的答案...我知道我提出了很多问题,但是任何帮助都将不胜感激!(也许我不是唯一感兴趣的人)