我知道在c ++中声明对象实例时如此:
Object object
调用Object构造函数并为该对象提供内存,但是我发现当你在java中执行此操作时,对象实例在以下情况下没有值:
object = new Object()
写的。我想特别知道为对象提供内存的时间。我认为构造和新关键字都分配了内存,所以Object object = new Object()
似乎是多余的。我在oracle的网站上看到了声明" reserve"记忆和新的"分配"记忆,我想知道两者之间有什么区别。
答案 0 :(得分:5)
您需要区分变量所需的空间和对象所需的空间。请记住,变量的值只是一个引用 - 非常类似于C ++中的指针。所以如果你有:
Object x = null;
然后变量x
本身占用足够的空间用于引用(通常为4或8个字节)。现在,如果你有:
x = new Object();
创建一个对象 - x
的值现在是对新创建的对象的引用。 x
本身占用的空间与以前相同,但也有对象本身所需的空间(基本上是字段,对象类型的引用,以及同步和房屋的数据) -keeping)。
答案 1 :(得分:2)
当您执行类似
的操作时Object object = new Object()
在Java中,object是对托管堆上实际实例的引用。与C ++相比,那是粗略的做法
Object* object=new Object()
所以当你这样做时
Object object;
在Java中,为实例的“引用”创建了一个位置。 与
类似Object* object;
在C ++中。
答案 2 :(得分:1)
Object foo=null;
在C ++的含义中为对象类的对象创建了引用foo。因此,它仅消耗内存以供参考。
Object realFoo=new Object();
使用此对象的任何内容创建此类引用以及真实对象。因此,它是参考和对象本身的内存。
在Java中没有内存预留 - 只有内存分配。
答案 3 :(得分:0)
声明保留内存:方法内的参数和变量将在堆栈帧中为它们保留内存。
分配内存:在运行时,执行" new"时,将为堆上的新对象分配内存
答案 4 :(得分:0)
了解在Java中,Object object
只是名为Object
的{{1}}的引用,这一点非常重要。如果您熟悉C ++,可以将此引用视为指针(虽然它不完全相同)。
在64位计算机上,object
引用为8个字节。当您使用object
关键字实际实例化Object
并将其分配给引用时,这就是为new
分配内存的位置。