繁体   English   中英

当为数组和对象调用new运算符时到底发生了什么?

[英]what exactly happens when new operator is called for array and object?

我可能错了,但是从我在java中创建对象时的理解:

Class object = new Class;

new Class创建Class类型的新对象,然后应用于"object"引用

所以当你通过以下方式创建对象数组时:

Class[] objects = new Class[10];

是否意味着new Class[10]创建了10个Class类型的对象,然后将其应用于objects引用,或者仅保留10个Class类型的对象的内存,并且您需要稍后创建某些对象

稍后是正确的new Class[10]将为内存中的10个对象创建占位符,您需要在其中显式放置对象。

new Class[10]确实为10个占位符创建了内存。 它不为单个条目分配内存。

考虑以下示例:bool [] booleanArray; FileInfo []文件;

booleanArray = new bool[10];
files = new FileInfo[10];

这里,booleanArray是值类型System.Boolean的数组,而files数组是引用类型System.IO.FileInfo的数组。 下图显示了执行这四行代码后CLR管理的堆的描述。

在此输入图像描述

尽管这是一个C#的例子。 这与我们在Java中的类似。

对象将是指向指针数组的指针。 这些指针将指向Class类型的对象。 除了实际的指针之外,没有为任何人分配内存。 所以新的Class [10]会创建10个指针,这些指针由对象引用。

创建一个对象数组类似于创建变量,即代码Class[] objects = new Class[10]; 可以解释为

Class object1;
Class object2;
...

使用它们或调用函数和访问变量我们必须调用构造函数即。

object1 = new Class();
object2 = new Class();

所以Class[] objects = new Class[10]; 正在创建10个Class引用,并且没有为对象进行内存分配。 为此,我们必须为它们调用构造函数,如object[0] = new Class(); 现在已创建对象已分配内存,我们可以使用它们。 另外,如果在创建没有调用构造函数的对象数组之后,我们就像对象[0] .somefunction()一样使用它们,它将显示空指针异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM