黑马程序员技术交流社区

标题: 关于new关键字问题?? [打印本页]

作者: Dej@vu    时间: 2013-8-7 20:13
标题: 关于new关键字问题??
我们都知道用new关键字可以在内存中开辟一块内存空间,而在什么情况下Java会自动开辟内存空间那??
比如说:给String类型重新赋值的时候就会重新开辟空间
还有没有像这样的例子了????
作者: yan    时间: 2013-8-7 21:16
Java把内存划分成两种:一种是栈内存,一种是堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配
堆内存用来存放由new创建的对象和数组
用new的方式是生成不同的对象。每一次生成一个
不知道这样解释 你能明白吗
作者: yan    时间: 2013-8-7 22:50
肥猫兄,貌似我回答了吧,就这两种方式开辟内存啊,如果还有其他方式,请赐教
作者: 天涯海角    时间: 2013-8-8 13:06
java在内存中把内存划分为五个内存空间:堆内存、栈内存、方法区、本地方法区、寄存器。
new关键字可以在堆内存中开辟空间。static在定义一个成员变量时也可以在方法区中开辟空间,相当于共享资源。
作者: 赵国刚    时间: 2013-8-10 08:10
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个地址(即引用)赋值给数组,这样就可以了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2