(自转) http://www.iteye.com/topic/634530
1 .寄存器:最快的内存空间由编译器根据需要分配,所以我们不能用程序控制。
2 .堆栈:存储基本类型的变量数据和对对象的引用,但对象本身不存储在堆栈中,而是存储在堆(从new出来的对象)或常量池中。 字符串常量对象存储在常量池中。 )
3 .堆:存储从new出来的所有对象。
4 .静态域:存储静态成员(在静态中定义) ) ) ) ) ) ) ) )。
5 .常量池:存储字符串常量和基本类型常量(公共静态final )。
6 .非RAM存储:永久存储空间,如硬盘
这里主要关心堆栈、堆和常量池,可以共享堆栈和常量池中的对象,而不能共享堆中的对象。 可以确定堆栈中的数据大小和生命周期,如果没有要引用的数据,则该数据将消失。 回收堆中的对象由垃圾收集器负责,因此不需要确定大小和生命周期,并且具有灵活性。
对于字符串:对该对象的所有引用都存储在堆栈中,如果是编译时已经创建的(直接在双引号中定义的),则存储在常量池中;如果是运行时(在new中出现的),则存储在堆中如果equals是相等的字符串,则常量池中始终只有一份,堆中有多份。
Java代码Strings1='china ',如以下代码所示: Strings2='china '; Strings3='china '; stringsS1=newstring('China ' ); stringsS2=newstring('China ' ); stringsS3=newstring('China ' );
现在说明黄色的三个箭头,在new上生成字符串“china”时,首先检查常量池中是否已经有“china”对象,否则在常量池中创建此字符串对象,然后在堆中创建此“china” 这也就是有道问题。 strings=newstring(「XYZ”); 生成多少个对象? 一两个,定数池本来就没有“xyz”的话就是两个。
对于基本类型的变量和常量:变量和引用存储在堆栈中,常量存储在常量池中。
以下代码:
Java代码inti1=9; inti2=9; inti3=9; publicstaticfinalintINT1=9; publicstaticfinalintINT2=9; publicstaticfinalintINT3=9;
对于成员变量和局部变量:成员变量是在方法外部、类内部定义的变量。 局部变量是在方法或语句块中定义的变量。 局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于堆栈存储器中。 堆栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象中,由垃圾收集器负责回收。
以下代码:
Java代码classBirthDate{privateintday; 私密int month; 隐私在年; 公共birth date (intd,intm,inty ) {day=d; month=m; 年=y; 省略get,set方法……} public class test { publicstaticvoidmain (string args (} { int date=9; 测试测试=new test (; test.change (数据; birth date D1=new birth date (7,7,1970 ); }公共语音更改1 (Inti ) {i=1234; }
}
在以上代码中,date是局部变量,I、d、m、y都是自变量为局部变量,day、month、year是成员变量。 分析一下代码运行时的变化。
1 .开始执行1. main方法: int date=9;
date局部变量、基本类型、引用和值存在于堆栈中。
2 .测试测试=new test (;
test是对象引用,存在于堆栈中,对象(new Test ) )存在于堆中。
3.test.change(date );
I是局部变量,引用和值存在于堆栈中。 方法change执行完成后,I将从堆栈中消失。
4.birth date D1=new birth date (7,7,1970 );
d1是对象引用,存在于堆栈中,对象(“new BirthDate”) )存在于堆中。 其中d、m、y以局部变量存储在堆栈中,它们的类型是基本类型,因此这些数据也存储在堆栈中。 day、month和year是成员变量,存储在堆中。 new BirthDate () )。 执行BirthDate构造方法时,d、m和y将从堆栈中消失。
5 .执行5.main方法后,date变量、test和d1引用从堆栈中消失,new Test ()、new BirthDate ) )等待垃圾回收。