枚举常量成员被使用时候的内存图
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
(1). 示例代码
public class WeekDay {
//Step1. 私有化构造方法
private WeekDay(){}
//每一个元素分别用public static final的成员表示
public static final WeekDay MON =new WeekDay();
public static final WeekDay SUN =new WeekDay();
public WeekDay nextDay(){
if(this ==MON)
returnSUN;
returnMON;
}
public String toString(){
return (this==SUN)?"SUN": "MON";
}
}
测试类代码:
WeekDayweekDay =WeekDay.MON;
System.out.println(weekDay.nextDay()); // println会调用toString()方法
//所以,打印出 “MON”字符串
(2). WeekDay weekDay =WeekDay.MON;的内存图是什么样子的?
【分析】
{1}. WeekDay.MON的出现实际上调用了WeekDay这个内部的构造方法,所以这个WeekDay的class文件就立刻进入内存,那么这个类中的全部对外全局常量(public static final) 都在方法区的静态部分开辟空间并被初始化。
本例中public static final WeekDay MON和publicstatic final WeekDay SUN这两个引用变量就存放在方法区的静态区域。他们的值就是同时通过new WeekDay();在堆内存中创建的对象的地址值。new的东西全部在堆内存中,但是静态的引用全部存放在方法区的静态部分,而不是栈内存中。
所以:WeekDay一进内存,内存图如下:
{2}. 计算完赋值运算右边的部分之后,将地址值赋值给测试方法的局部引用变量。局部变量在栈内存中开辟空间并赋值。
这里将
WeekDay weekDay =WeekDay.MON;
此时,内存图变化如下:
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------