java中一切皆为对象 Object o = new Object(); 就以上而言: -------------------------------------------- o 是指向Object对象的引用(refernce) 而这个引用存放在栈中。 --------------------------------------------- 实际的对象存放堆中。--------------------------------------------- 不知楼主要的是不是这个意思
¥################################################################### 不好意思,我好象没有表达好我的意思!对于: Object o = new Object(); 实际的对象放在堆,这个我知道我疑惑的是: 引用o,它也应该属于一个对象啊,那o也应该在堆中,照这样的理解,在堆栈中放什么?
Java中间并不是万物都是对象的,比如基本类型就不是对象
基本类型变量放栈内存中,对象放在堆内存中,如 Object o = new Object(); o作为对象的一个引用放在栈内存中,变量o中记录了对象的句柄 而创建的对象实例放在对内存中,
其实很简单的 String str=new String(); 在堆中产生一个对象,在栈中存放这个对象的引用。 明白吗? 不明白还可以说出来,共同探讨。 ok.
举个例子: public class SimpleClass{ private int age=20; private String name=new String("simpleclass"); static String country="China";
public int getAge(){ return age; }在上面例子中,当加载类的时候,jvm分析字节码会把simpleClass的名字"SimpleClass" 类型"class" 修饰符"private " ; country的类型"String"+"static"+"country"+值"China" ; age的类型"int"+名字"age"+修饰符"private"+值"20" ; getAge()方法的信息(包括代码)也都存到方法区里. 而且;name 的类型"String"+修饰符"private"+名字"name" + new String("China")的字符串也保存到方法区中,这是并没有对象生成,但这个类实例化后,执行到这一步的时候,jvm会解析这个,发现是对一个String 的引用,这样就会经过比较复杂的经过,在堆中分配对象,而且把这个引用压入到当前的栈中. 好象很多的信息都是存放在常量池中,具体怎么样我还没有看过.上面写的应该有些地方是错的,希望大家一起来探讨了}
堆栈存放的是变量和引用,如int a; String b;定义后他们就都在堆栈里,到了作用域结束后他们就自动被释放。由下面的例子可以看出,变量和引用的定义和释放都是符合栈的特点的(先进后出)。 需要注意的是String b这个例子,对类的引用存放在栈里,而对象本身存放在堆里。 { int a; { int b; String c; }//释放b,c }//释放a
再补充一句,上面所说的变量和引用指的是方法中所定义的,比如下面例子中的b,这些空间不是由Garbage collecter控制,而且这些空间的申请与释放也非常快,几乎与C/C++相同。这部分空间与对象所占的空间不同,对象所占的空间是对象中所有的属性所占的空间,由Garbage collecter负责清除,如下面例子中的a。class A{ int a; public void method(){ int b; } }
Object o = new Object();
就以上而言:
--------------------------------------------
o 是指向Object对象的引用(refernce)
而这个引用存放在栈中。
---------------------------------------------
实际的对象存放堆中。---------------------------------------------
不知楼主要的是不是这个意思
对象引用是存储在栈stack中,
另外,考虑到效率问题,所有基本类型的变量也存放在栈内
不好意思,我好象没有表达好我的意思!对于:
Object o = new Object();
实际的对象放在堆,这个我知道我疑惑的是:
引用o,它也应该属于一个对象啊,那o也应该在堆中,照这样的理解,在堆栈中放什么?
Object o = new Object();
o作为对象的一个引用放在栈内存中,变量o中记录了对象的句柄
而创建的对象实例放在对内存中,
String str=new String();
在堆中产生一个对象,在栈中存放这个对象的引用。
明白吗?
不明白还可以说出来,共同探讨。
ok.
不管是堆还是栈, 异或Array Set List等等,他们存放的都是对象的引用 Reference
堆栈中存放对象的引用对象(reference).
个人认为就是指针.只是引用是不可计算的指针.
STATIC常量是放在静态存储区的
对像是放在堆中
一、栈(也就是通常所说的堆栈):对像的引用放在这里
二、堆:实际的对像放在这里
三、静态存储:static元素存放在这里
PC计数器就是存放jvm指令的区域.
本地方法区用来调用当前系统的方法函数,和一些动态连接库有关的区域.
一般主要讨论的是方法区,堆,栈三个数据区.
堆主要存放实际的对象,在这里又涉及到了如何释放对象的问题,这样又是另外一个技术GC.
栈中主要存放 对象的引用,一些局部变量,参数,中间结果值,返回值等等.
而方法区:主要存放类的一些信息:其实这个方法区是最重要的,当加载类的时候,jvm会从字节码中提取出有用的信息 按照设计好的数据结构和算法来存放信息.
按类型来分:类的信息(名字,类型,修饰符,)类的变量(也就是静态变量)字段的信息(数据类型,名字,修饰符),方法的信息(名字,参数的个数和类型,返回值,修饰符),
还有每个方法的代码(也就是字节码),
好象还有异常(因为有些类可能要抛出异常),也不知道怎么存的.
而在这方法区中最重要的又是常量池:简单的说就是字符串,在这个类的信息中所有用到的 字符.
不同的虚拟机对这些区域的设计实现都是非常不同的,在设计这些程序的时候就需要非常好的数据结构的知识和算法知识了.
举个例子:
public class SimpleClass{
private int age=20;
private String name=new String("simpleclass");
static String country="China";
public int getAge(){
return age;
}在上面例子中,当加载类的时候,jvm分析字节码会把simpleClass的名字"SimpleClass" 类型"class" 修饰符"private " ; country的类型"String"+"static"+"country"+值"China" ;
age的类型"int"+名字"age"+修饰符"private"+值"20" ; getAge()方法的信息(包括代码)也都存到方法区里.
而且;name 的类型"String"+修饰符"private"+名字"name" + new String("China")的字符串也保存到方法区中,这是并没有对象生成,但这个类实例化后,执行到这一步的时候,jvm会解析这个,发现是对一个String 的引用,这样就会经过比较复杂的经过,在堆中分配对象,而且把这个引用压入到当前的栈中.
好象很多的信息都是存放在常量池中,具体怎么样我还没有看过.上面写的应该有些地方是错的,希望大家一起来探讨了}
需要注意的是String b这个例子,对类的引用存放在栈里,而对象本身存放在堆里。
{
int a;
{
int b;
String c;
}//释放b,c
}//释放a
int a;
public void method(){
int b;
}
}