关于java成员变量、局部变量的存储问题

miaoluy 2014-06-23 02:02:06
首先这个问题肯定是一个老问题了,我是新手 ,上午本来想百度看看的,但是各种各样的答案让我实在不知道怎么去系统的理解这个问题,废话不说上代码
public class Test {
String s1 = "abc";
String s2 = "abc";
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.s1==test.s2); //true
}
}
这是一个很easy的代码,如果单从代码角度而言 ,String s1 = “abc”这步将“adc”对应的内存地址存在栈中,s1指向这个地址。s2同上。
但是在main中,我是new了一个Test出来,这个new Test()显然是个对象放在堆中,那这个对象所有的属性不也应该在堆中么,那test.s1和test.s2是不是也应该在堆中么?
还有个问题是这里的test.s1和test.s2怎么会相等的
...全文
243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
miaoluy 2014-06-24
  • 打赏
  • 举报
回复
引用 2 楼 zgd77521 的回复:
经典的堆指向栈,你new出来的对象是放在堆中的,但是你所指向的值是在栈中啊,“abc”就是作为常量存在栈中的,不管你new多少对象,都会指向这里。
其他几个大大回答的很好,但显然层主更明白我的意思(“==”是比较地址这个我还是知道的,常量池什么的我也是清楚的)
北落师门_Orz 2014-06-23
  • 打赏
  • 举报
回复
首先你要了解 == , ==比较的是地址 那么你将s1 赋值为abc 就代表在内存中开辟了一个abc的空间 你将s2也赋值为abc 如果此时内存中没有abc的空间,就会新建一个如果有就同样会指向已创建的abc 那现在就很明白了 ==比较的是地址,而你的s1 和 s2 又指向同一个 地址,所以true是必然的
lxbccsu 2014-06-23
  • 打赏
  • 举报
回复
如果不好理解,你反过来这么理解: 假如Test 类有如下的属性: Test a = new Test (); Test b = a; 你怎么理解a和b呢?
我爱小猴子 2014-06-23
  • 打赏
  • 举报
回复
在java中有个地方叫“变量池”,像定义 s1和s2的时候,java会在“变量池”中寻找是否有已经定义过的, 如果有就将引用指向它,这样,当我们使用“==”比较时由于它们是同一个对 象所以输出的是ture。 String s1 = new String("abc"); String s2 = new String("abc"); 比较的结果就是false
lxbccsu 2014-06-23
  • 打赏
  • 举报
回复
引用 楼主 miaoluy 的回复:
但是在main中,我是new了一个Test出来,这个new Test()显然是个对象放在堆中,那这个对象所有的属性不也应该在堆中么,那test.s1和test.s2是不是也应该在堆中么? 还有个问题是这里的test.s1和test.s2怎么会相等的
那个new 出来的对象肯定是在堆中了,"abc"是存储在字符串常量池中; s1和s2 都是指向 "adc”对应的内存地址,也就是指向同一个地址值,==比较的就是两个地址是否相等; 你可以画个图更直观些!
zgd77521 2014-06-23
  • 打赏
  • 举报
回复
经典的堆指向栈,你new出来的对象是放在堆中的,但是你所指向的值是在栈中啊,“abc”就是作为常量存在栈中的,不管你new多少对象,都会指向这里。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧