日期:2014-05-20  浏览次数:20660 次

java内存问题
定义一个java类,在内存中是栈内存指向堆内存的一个地址。那个这个新new出来的对象是在堆内存中。 如果这个类里面有static修饰的变量,那么这个变量是放在数据区的,这里怎么理解,是堆内存中的对象指向数据区的一个地址吗?

------解决方案--------------------
呵呵,今天刚学了static。弱弱的解释下吧。。。
static 修饰的成员变量,是所有对象的共享内容,在JVM加载该类时,就被加载进了内存,存放在方法区的静态区,它是优先于对象存在的,不需要new 出对象,就可以被类直接调用。调用方法:类名.变量名 。
------解决方案--------------------
探讨
呵呵,今天刚学了static。弱弱的解释下吧。。。
static 修饰的成员变量,是所有对象的共享内容,在JVM加载该类时,就被加载进了内存,存放在方法区的静态区,它是优先于对象存在的,不需要new 出对象,就可以被类直接调用。调用方法:类名.变量名 。

------解决方案--------------------
首先要区别变量和对象
Object o = new Object();
那么o是变量,new Object()是对象,变量o的内存中保存new Object对象的地址
new出来的对象在堆中,所以new Object()对象存在于堆中,这个没有问题的
LZ的疑惑是o变量本身存在哪里,对吧

如果o是局部变量,那么o存在于定义该变量的方法的栈内存中,
比如 void a() {Object o = new Object();} 
那么o存在于a方法栈内存中,在a方法被调用的时候分配内存的

如果o是非static成员变量,那么o存在于它所依存的对象的数据区中,即o存在它的对象的内存中(o作为该对象的属性而存在)
比如
class A {
Object o = new Object();
}
那么o存在于A对象的数据区中,在A对象被生成的时候分配内存的

如果o是static变量,那么o存在于方法区(也叫静态区)
比如
class A {
static Object o = new Object();
}
那么o存在于方法区,在类加载的时候被分配内存的