A a=new A();为A对象创建了一个实例。但在内存中开辟了两块空间。一块空间在堆区,存放new A()这个对象。另一块空间在堆栈,也就是栈,存放 a,a的值为new A()这个对象的内存地址。因为java在JVM(java虚拟机)中运行,所以a描述的内存地址不一定是这个对象真实内存的地址
首先一点:Java类需要实例化才能使用。A []tmp=new A[10]; 这句话的内存开辟过程是这样的:1. 在内存里开辟一段内存X,长度是1块,存储tmp。 数组对象的引用。2. 在内存中开辟一段连续的内存Y,长度是10块。 数组对象。3. X里面的值是Y的地址,也就是tmp是Y这段内存的引用。4. 这个时候问题就来了,你并没有去实例化类A。也就是说你并没有开辟十段内存空间去存储是个A的实例化对象,并将它们的地址存到数组对象Y里面。也就是说现在Y里面的引用时空,即并没有指向任何内存空间。这个时候tmp[0]里的值是空,根本没有引用到A的实例化对象(实际上没有创建),所以就会报错了。综上,所以JAVA的思想就是,开辟内存空间A存放实例化对象,开辟另一段空间B去存储A的引用。我们访问A这段内存是通过B来找到A的。所以你的代码想要运行,需要new十次,即创建10个A对象,将其10个地址(即引用)赋值给数组,这样就可以了。 |