我一直在练习基于组件的设计模式,我想知道当你初始化一个没有引用含义初始化为null的变量时,Java会继续在内存中归一个具有变量大小的空间,即使它设置为null,以便最终当您需要使用类的新实例重新初始化它时,它只复制新实例的字段?
答案 0 :(得分:3)
类型为引用类型的变量占用相同的空间量,无论它包含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"是一个" Sometype"相反,仍然初始化为null,假设只有一个引用的空间将被保存,直到您为相关类型的数组创建新的有效引用,这是否合法?
数组类型也是引用类型。所以,是的,答案是一样的。声明SomeType[] s
将为一个参考保留空间。
答案 1 :(得分:1)
我想知道当你初始化一个没有引用含义初始化为null的变量时,Java会继续并在内存中定义一个具有变量大小的空格,即使它被设置为null
是的,为变量分配了内存,但这只是内存的一小块地址空间,没有别的。没有为最终对象分配内存。
因此,当您需要使用类的新实例重新初始化它时,它只复制新实例的字段?
当你创建任何东西的实例时,就会在堆上为对象分配内存,无论对象是分配给变量,没有变量,还是分配给50个变量,以及引用的任何变量,都会发生这种情况。对象的地址空间指向对象在堆上的位置(也许 - 我不认为实际的机制, hows ,是完全指定的)< / p>
答案 2 :(得分:1)
查看有关objectcreation
的oracle文档页面Point originOne;
如果您像这样声明originOne,则在实际创建并分配对象之前,其值将不确定。简单地声明引用变量不会创建对象。
For that, you need to use the new operator
,如下一节所述。在代码中使用对象之前,必须将对象分配给originOne
。
实例化
new运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。 new运算符还调用对象构造函数。
注意:短语&#34;实例化一个类&#34;意味着和#34;创建一个对象。&#34; When you create an object, you are creating an "instance" of a class, therefore "instantiating" a class
。
new运算符返回对其创建的对象的引用。此引用通常分配给适当类型的变量,如:
Point originOne = new Point(23, 94);
我希望上面的图片能够澄清您的疑问。
引用的大小为4个字节或8个字节。看看这个SE问题:
How big is an object reference in Java and precisely what information does it contain?