int[] arr=new int[0]
即定义一个数组长度为0的数组
在栈空间会开辟一块 int[] 类型空间 用来存储堆空间对象地址 (数组长度为0 一直没搞懂到底是啥分配空间的?) 而在堆空间中 因为要创建对象(创建对象的第一步 即在堆空间开辟一块合适大小的空间) 没搞清楚到底有没分配空间?
还有顺便问一下C#中的引用类型 和 C++中的指针有啥区别没?
堆中 分配了,只是 空间大小的问题
我认为应该是分配了 不过 数组长度为0 里面没有存任何元素 我想问一下到底分配了什么类型大小的空间
像int[] arr=new int[3] 在堆空间分配了三块连续的int类型空间(应该可以这样理解) 就是想问一下数组长度为0的话 具体是如何的
@Lumia1020:
除了 里面元素大小空间的分配,还有其他的分配,如数组类型 TypeHandler、基类及祖先object中的等成员进行分配,再根据数组大小分配,如 int[3],再分配3个子元素,如果是int[0],就不分配了。
@Qlin: 除了 里面元素大小空间的分配,还有其他的分配,如数组类型 TypeHandler、基类及祖先object中的等成员进行分配,再根据数组大小分配,如 int[3],再分配3个子元素
这句话有点不明白 在创建对象的时候 第一步不是在堆空间开辟一块合适大小的空间 第二步才是创建对象吗(创建对象的时候 会根据自身类中的成员以及继承自父类的成员 一般类都会继承object 再在空间中创建对象 ) 像int[] arr=new int[3]( 首先是在栈空间中开辟一块int[]类型空间 即变量arr 用来之后存储堆空间中对象地址 )
而new int[3]的时候 会在堆空间中开辟三块int类型大小空间(或许可以这样理解) 第二步根据int类中的相关成员创建对象(包括继承自父类object valueType类的相关成员 int本身为结构体 本质也是一个类吧)
如果是int[] arr=new int[0] 按照以上理解 好象有没开空间 请问大神 以上理解有何误区?
@Lumia1020: 你的理解没错,当int[0]时,还有其它的成员会占空间,不只是这个子元素
@Qlin: 嗯 你讲的我了解 我就是还有一个地方有点不明白 new 一个对象的时候 有四个步骤 1 开辟合适大小的空间 2 依照类的模板创建对象 3 调用构造方法 4 返回堆空间的地址
就是第一个步骤的时候 开辟合适大小的空间 (什么叫做合适大小?) 第二个步骤是依照类的模板创建对象成员
像以上讲的 new int[3] 那么 在第二个步骤的时候 会创建int类型自身中的所有成员以及object ValueType中的所有继承过来的成员(父类继承过来的成员是在第二个步骤创建的) 如果是new int[3] 那么在第一步是开辟一块空间(类似三个int类型空间之和) new int[0] (0个int类型空间 那么相当于没有开辟空间? 我就是这个地方有点不理解)
还有第三步 创建对象 要调用构造方法 而在调用构造函数之前 看反编译工具 在第二步的时候(第二步即创建对象) 应该是已经创建好继承父类过来的成员
而创建对象中的第一步就已经确定好空间(这个不知道有没有错误?) 我就不知道第一步 到底开辟多少空间 才为合适大小空间
不知有没有表达清楚 你再看看 麻烦了
还有顺便我想问一个问题 像string类型 接口类型 如果在Main方法中定义如下
string a="123"
IFly b=new Bird() IFly为自定义的一个接口
由于a b变量最终都仅仅是存储一个地址 地址指向堆空间对象地址 那么在栈空间中开辟的空间大小
即string类型变量a IFly接口类型变量b 空间是不是一样大小?(由于都是引用类型 仅仅只存储一个地址 地址指向堆空间创建的对象)