1.常量池
常量池中一般存储的是常量和String双引号内的数据
public static final int NUM1=1;//在常量池中创建1,常量NUM1指向常量池中的1
public static final int NUM2=1;
public static final int NUM3=1;//由于常量池已经存在1,NUM2、NUM3都指向常量池中的1
String s1="abc";//在常量池中创建"abc"
String s2="abc";//由于常量池已经存在"abc",s2指向常量池中的"abc"
String s3="ab";//在常量池没有找到"ab",所以在常量池创建"ab",并使s3指向常量池中的"ab"
2.堆栈
堆:堆中存放的都是被new出来的对象本身及类中被使用到的成员变量,并且堆中的数据生命周期是不需要确定的,在使用完毕后会自动回收。被new出来的对象内容使可以重复的,所以堆中存储的数据可能会有重复。
栈:栈中存放的一般是基本类型数据变量,方法的调用,形参,局部变量,栈中的数据有固定的生命周期,比如在一个方法中定义一个变量:int a;,a就只能在此方法中使用,方法调用完毕之后变量a就会被回收。
3.分析
class BirthDate {
2. private int day;
3. private int month;
4. private int year;
5. public BirthDate(int d, int m, int y) {
6. day = d;
7. month = m;
8. year = y;
9. }
10. 省略get,set方法………
11. }
12.
13. public class Test{
14. public static void main(String args[]){
15. int date = 9;
16. Test test = new Test();
17. test.change(date);
18. BirthDate d1= new BirthDate(7,7,1970);
19. }
20.
21. public void change1(int i){
22. i = 1234;
23. }
24. }
1.main()方法被加载到栈中
2.在栈中创建date---->9
3.在堆中创建一个Test类对象
4.在栈中创建test,并让test指向堆中的Test类对象
5.在栈中加载change()方法
6.在栈中创建变量i---->1234
7.变量使用完毕,从栈中移除
8.change()方法结束,从栈中移除
9.在栈中创建形参:d---->7,m---->7,y---->1970
10.在堆中创建BirthDate类的对象,并创建其成员变量day---->d,month---->m,year---->y
11.形参变量d,m,y使用完毕从栈中移除
12.在栈中创建d1,并指向堆中的BirthDate类的对象
13.date,test,d1使用完毕,从栈中移除
13.main()方法使用完毕,从栈中移除
14.new Test()和new BirthDate()被自动回收