A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© barlay   /  2013-12-12 21:45  /  2772 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

barlay 中级黑马 2013-12-13 20:35:49
21#
Kyle 发表于 2013-12-13 00:55
你对常量池的概念理解有偏差,不要激动,冷静分析问题。
Java当中是有常量池的,这个概念我可以100%的跟 ...

你是按照语句执行顺序一步一步分析的,但实际情况是这样的:
1、Java源文件被编译器编译成class字节码文件,在编译的过程中,编译器把所遇到的常量都统一存储于字节码文件中的data段中;
2、程序执行时,字节码文件被加载到内存中,这时data段中的内容被加载到只能读不能写的内存区域,所以当字节码文件被解释执行时,肯定是能在这个区域中找到所有常量的。
总结:
String a = "a";         //将常量区的“a”的地址赋给 a
String a =“ab”;  //将常量区的“ab”的地址赋给 a
String c ="a";         //将常量区的“a”的地址赋给 c
回复 使用道具 举报
在张孝祥老师的视频中有讲到一个自动拆箱和自动装箱原理,对于在128到-127之间常用的integer封装对象,由于经常使用,java就赋予了一个自动转换功能,当需要和int类型的变量进行比较的时候,就会自动拆箱转换成int类型的局部变量,但是超出这个范围是不可以的,比如:
nt c = 200;
Integer d = new Integer(200);
System.out.println(c == d);//此时,打印为false。
回复 使用道具 举报
Kyle 中级黑马 2013-12-13 23:18:38
23#
barlay 发表于 2013-12-13 20:35
你是按照语句执行顺序一步一步分析的,但实际情况是这样的:
1、Java源文件被编译器编译成class字节码文 ...

加载class字节码的内存区域叫做方法区,常量池是在方法区内的。
只能读不能写这个解释我不知道你是从哪里查来的,这解释是肯定有问题的。
若按照你的说法:
我们知道,被static修饰过的成员变量是随着class的加载而加载的,它也存于方法区中,
很显然,static修饰过的成员变量当中的值是可以修改的,而且一旦修改就会被其他对象共享。
你觉得你的只能读不能写的解释能说通吗?

另,上述Integer包装类的问题,关于-128~127的整型数值是存在常量池当中的概念你理解了吗?
回复 使用道具 举报
barlay 中级黑马 2013-12-13 23:36:21
24#
Kyle 发表于 2013-12-13 23:18
加载class字节码的内存区域叫做方法区,常量池是在方法区内的。
只能读不能写这个解释我不知道你是从哪里 ...

方法区中应该包括:
1、只可读不可写的常量区;
2、可读可写的静态区
3、可被各个类对象共享的静态方法区
4、和每个类对象相关的代码区
大概是这个样子的,也许有误,这得深入JVM虚拟机了,功力不够,还要慢慢积累。这个问题留待解决,OK?
回复 使用道具 举报
Kyle 中级黑马 2013-12-13 23:44:40
25#
功力大成之日记得分享下经验并@我一下
共同学习 {:soso_e144:}
回复 使用道具 举报
barlay 中级黑马 2013-12-13 23:49:26
26#
Kyle 发表于 2013-12-13 23:44
功力大成之日记得分享下经验并@我一下
共同学习

和你聊得很愉快啊,加个好友吧,O(∩_∩)O哈哈~
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马