Java 关于变量在堆栈、常量池的存储理解

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()被自动回收

你可能感兴趣的:(java)