String s1 = "sss111" 是 变量还是常量?

LoginOut 2009-01-07 11:57:53
看到一个关于String的帖子
public class Test {
public static void main(String[] args) {
String s1 = "sss111";
String s2 = "sss111";
}
}

在上面程序中存在2个相同的常量"sss111",对于n个值相同的String常量,在Constant Pool中
只会创建一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的表示:


String s1 = "sss111"应该是一个局部变量才对,不是有final修饰符的才是常量吗?



...全文
2884 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
WIN_ANGEL 2009-01-08
  • 打赏
  • 举报
回复
进来瞅瞅
yingmu 2009-01-08
  • 打赏
  • 举报
回复
"sss111"是一个字符串常量,java为每一个String类型(有别于StringBuffer)的字符串在内存中申请一块空间之后,这块空间的内容就不会变了,所以说它是常量,而s1和s2是两个字符串“类”类型的变量,对一个类的实例名来说,它的“值”只不过是一个内存地址(可以说是一个整数值?),而这个内存地址指向的地方存着这个实例的具体的“内容”,s1和s2只不过是“恰好”拥有相同的“值”,即存放实际内容的内存地址,所以如果这时用s1 == s2来判断的话,因为它们的“值”相同,所以应该是true,你可以这样试试:
String s1=new String("sss111");
String s2=new String("sss111");

String s1 = "sss111";
String s2 = "sss111";
比较一下“==”的结果

这是java对字符串常量(String类型)的“存储优化”(同一个常量只申请一块内存空间,申请之后不再变化),不知道我这样理解对不对,呵呵。
meihuiyu 2009-01-08
  • 打赏
  • 举报
回复
s1和s2是不同的两个对象,它们的值是相同的
Dream_JavaWorld 2009-01-08
  • 打赏
  • 举报
回复
mark
bleachkinsin 2009-01-08
  • 打赏
  • 举报
回复
都是变量,只是都指向String常量池中sss111
wufx05 2009-01-08
  • 打赏
  • 举报
回复
他们都指向sss111
所以就只有一个sss111
renlei413326889 2009-01-08
  • 打赏
  • 举报
回复
在池中就只要一个对象
renlei413326889 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fulianglove 的回复:]
s1,s2是指向一个String的变量,
"sss111" 是一个固定的字符串,在java中创建好的字符串时不能被修改的,故为常量
[/Quote] ----------非常同意!
dirtykiss 2009-01-08
  • 打赏
  • 举报
回复
都是变量。只是都指向String常量池中sss111,这就是字符串的特别之处
Vicaso 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zc7h777 的回复:]
String变量是引用类型,必定指向一个对象。
public class Test {
public static void main(String[] args) {
String s1 = "sss111";
String s2 = "sss111";
}
}
s1,s2都变量,在stack中,保存了常量"sss111"的引用,这里有别于final String s1 = "sss111"; s1保存的引用是一个常量,也就是说s1只能指向内存中的某个区域。
[/Quote]

同意
auex010 2009-01-08
  • 打赏
  • 举报
回复
明显s1,s2都是变量,如果硬要说的话——"sss111"是常量...
bigbro001 2009-01-07
  • 打赏
  • 举报
回复
这句话这么说可能会好一点:s1和s2的确是局部变量,储存在栈中,他们都指向同一个String对象"sss111",该对象在常量池中
ZangXT 2009-01-07
  • 打赏
  • 举报
回复
s1,s2这是变量。
"sss111"这是字面常量

先区分对象和引用再说。
flush_520 2009-01-07
  • 打赏
  • 举报
回复
整天讨论这些个人觉得没必要
明白那个意思就行了
mizukusa 2009-01-07
  • 打赏
  • 举报
回复
是只创建一个对象
bzwm 2009-01-07
  • 打赏
  • 举报
回复
s1,s2是局部变量,(引用类型)
sss111 在java栈中被共享。

s1,s2都指向sss111
fulianglove 2009-01-07
  • 打赏
  • 举报
回复
s1,s2是指向一个String的变量,
"sss111" 是一个固定的字符串,在java中创建好的字符串时不能被修改的,故为常量
酒剑仙 2009-01-07
  • 打赏
  • 举报
回复
哦 不会吧
只会创建一个吗?
那s1==s2试试 如果相等 证明正确 不等则不正确
slm007 2009-01-07
  • 打赏
  • 举报
回复
哎,这话题真是经久不衰呀
小曦子 2009-01-07
  • 打赏
  • 举报
回复
常量...两个引用....如果修改的话..就引用别的了..在JAVA学习笔记讲的很清晰的..去看看非常好的..
加载更多回复(16)

62,635

社区成员

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

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