首先要区别变量和对象 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存在于方法区,在类加载的时候被分配内存的
static String name = "st";
public static void main(String[] args){
Student s1 = new Student ();
Student s2 = new Student ();
System.out.println(s2.name == s1.name);
}
}
应该不是在new时才分配,应该是在编译时,name变量就分配好了地址空间,而new出来的Student对象在运行时期才分配地址空间大小,
如果运行System.out.println(s2.name == s1.name); 会返回true 说明name在内存中只有一份。
至于s1 和s2 是怎么关联到一个静态数据并且是在编译时就把name的地址在student的字节码中保存起来,这个就是编译器的作用了。
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存在于方法区,在类加载的时候被分配内存的
堆的特点是容量大,速度慢,可能便宜,就适合放置动态分配的数据,因为动态分配的数据不确定且容量大,数量多,比如对象,生存期相对较短,就以无序状态存储于堆中。像方法区之类是堆的一部分,我觉得更多是因为业务逻辑上便于分类管理的需要而应运而生的详细可看:
http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html