我一直在实践基于组件的设计模式,我想知道当您初始化一个没有引用的变量时--即初始化为null -- Java是否继续并在内存中赋予一个具有变量大小的空间,即使它被设置为null,以便最终当您需要用类的一个新实例重新初始化它时,它只是复制新实例的字段?
发布于 2016-03-09 03:27:09
无论变量包含null还是对对象的引用,其类型为引用类型的变量占用的空间都是相同的。
但是,变量只保存引用..。而不是物体本身。
..。当您需要用类的新实例重新初始化它时,它只是复制新实例的字段吗?
呃..。不是的。当您稍后“初始化”该变量时,您将为该变量分配一个引用。您不是在复制对象的字段。
例如:
SomeType s = null; // the declaration sets aside space for one
// reference, and the initialization assigns
// `null` to it.
s = new SomeType(...) // the 'new' expression creates the object and
// which allocates the space, etcetera
// the assignment merely assigns the reference
// for that object to 's'.如果"s“是一个仍然初始化为null的"Sometype”数组,那么假设在为相关类型的数组创建新的有效引用之前,只保存一个引用的空间是合理的吗?
数组类型也是引用类型。所以,没错,答案是一样的。声明SomeType[] s将为一个引用保留空间。
发布于 2016-03-09 03:23:47
我在想,当您初始化一个没有引用的变量时,如果初始化为null,Java是否会继续并在内存中属性一个具有变量大小的空间,即使它被设置为null。
是的,内存是为变量分配的,但是这只是内存的一个很小的地址空间,没有其他的。没有为最终对象分配内存。
因此,最终当您需要用类的新实例重新初始化它时,它只是复制新实例的字段?
当您创建任何东西的实例时,就会在堆上为对象分配内存,不管对象是否被分配给变量、没有变量或50个变量,任何引用对象的变量都有其地址空间指向堆中对象的位置(也许--我不认为实际的机制,即如何完全指定)
发布于 2016-03-09 04:33:57
查看有关对象创建的oracle文档页面
Point originOne;--如果您这样声明originOne,那么它的值将是未定的,直到一个对象被实际创建并分配给它。简单地声明一个引用变量并不会创建一个对象。
For that, you need to use the new operator,如下一节所述。在代码中使用对象之前,必须将对象分配给originOne。

实例化类
新操作符通过为新对象分配内存并返回对该内存的引用来实例化类。新操作符还调用对象构造函数。
注意:短语“实例化一个类”的意思与“创建一个对象”When you create an object, you are creating an "instance" of a class, therefore "instantiating" a class的意思相同。
新运算符返回对它创建的对象的引用。此引用通常分配给适当类型的变量,如下所示:
Point originOne = new Point(23, 94);

我希望上面的图片能澄清你的疑问。
引用的大小将是4字节或8字节。看看这个SE问题:
https://stackoverflow.com/questions/35882189
复制相似问题