黑马程序员--Java基础加强--01.枚举常量被使用的时候的内存图

枚举常量成员被使用时候的内存图

----------- 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学习型技术博客、期待与您交流! ------------

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值