java中,String类的值声明后不能修改?
书上说:java中,String类的值声明后则不能修改为什么这段代码中的String类型变量内容可以被修改?===============================...
书上说:java中,String类的值声明后则不能修改
为什么这段代码中的String类型变量内容可以被修改?
============================================
public class StringTest
{
public static void main(String args[])
{
String a = "你好!" ;
System.out.println(a) ;
a = "hello!" ;
System.out.println(a) ;
}
}
========================================
教程里使用了引用传递,讲解了String无法被修改
而我用最简单的赋值来进行测试,发现可以被修改
正在看基础概念,脑子还理得不是很顺,求指导,感谢! 展开
为什么这段代码中的String类型变量内容可以被修改?
============================================
public class StringTest
{
public static void main(String args[])
{
String a = "你好!" ;
System.out.println(a) ;
a = "hello!" ;
System.out.println(a) ;
}
}
========================================
教程里使用了引用传递,讲解了String无法被修改
而我用最简单的赋值来进行测试,发现可以被修改
正在看基础概念,脑子还理得不是很顺,求指导,感谢! 展开
5个回答
展开全部
String对象不可修改指的是对象本身不可修改,而不是引用不可修改。
String a = "你好";
这行代码的意思是声明一个String类型的引用变量叫做a,在内存中创建一个String对象(值为"你好"),然后把这个对象的引用赋值给变量a。
a = "hello";
这行代码执行的效果是在内存中另外创建了一个String对象(值为"hello"),然后把这个新对象的引用赋值给变量a,而不是把原来的内存中的那个“你好”的String对象值变为“hello”。如果之后内存中那个“你好”的String对象没有任何引用,那么就会被下一次垃圾回收器运行时回收。
String和所有的基本类型包装类的对象都是不变量。内存中的不变量对象的值是不能被改变的。
String a = "你好";
这行代码的意思是声明一个String类型的引用变量叫做a,在内存中创建一个String对象(值为"你好"),然后把这个对象的引用赋值给变量a。
a = "hello";
这行代码执行的效果是在内存中另外创建了一个String对象(值为"hello"),然后把这个新对象的引用赋值给变量a,而不是把原来的内存中的那个“你好”的String对象值变为“hello”。如果之后内存中那个“你好”的String对象没有任何引用,那么就会被下一次垃圾回收器运行时回收。
String和所有的基本类型包装类的对象都是不变量。内存中的不变量对象的值是不能被改变的。
展开全部
你误解了教程的意思,教程是比较了Object对象和String在作为方法参数传递后能否在方法内部被修改
比如:
public static void main(String args[]) {
String tmp = "a";
foo(tmp);
System.out.println(tmp) ; //这里输出的是a,而不是在foo里重新设定的b
}
private void foo(String str) {
str = "b";
}
==========================================================
如果传了一个对象
public class StringTest {
public String m_str;
public void toString() {
return m_str;
}
}
public static void main(String args[]) {
StringTest tmp = new StringTest();
tmp.m_str = "a";
foo(tmp);
System.out.println(tmp.toString()) ; //这里输出的是b,因为这个对象的m_str值在foo方法中被改变了
}
private void foo(StringTest str) {
str.m_str = "b";
}
比如:
public static void main(String args[]) {
String tmp = "a";
foo(tmp);
System.out.println(tmp) ; //这里输出的是a,而不是在foo里重新设定的b
}
private void foo(String str) {
str = "b";
}
==========================================================
如果传了一个对象
public class StringTest {
public String m_str;
public void toString() {
return m_str;
}
}
public static void main(String args[]) {
StringTest tmp = new StringTest();
tmp.m_str = "a";
foo(tmp);
System.out.println(tmp.toString()) ; //这里输出的是b,因为这个对象的m_str值在foo方法中被改变了
}
private void foo(StringTest str) {
str.m_str = "b";
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1. String a = "你好!" ;
内存中分配了两个空间,一个给a,一个给"你好!"。然后a指向"你好!"这个内存地址
2. a = "hello!" ;
内存中重新分配一个空间给"hello!",改变a的指向,指向"hello!"。同时"你好!"任然存在。
内存中分配了两个空间,一个给a,一个给"你好!"。然后a指向"你好!"这个内存地址
2. a = "hello!" ;
内存中重新分配一个空间给"hello!",改变a的指向,指向"hello!"。同时"你好!"任然存在。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
String可以赋值, 有等于号就是赋值吗, String是基本类型马? 再回去看看.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你看错了吧。又不是final的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询