String对象值传递和引用传递 值传递引用传递 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当把对象引用str1传递到一个方法后,这个方法可以改变这个对象的属性,并能返回相应的改变,但是这个对象引用指向的这个字符串是永远不会变的。至于你后面写的那个没有new对象的变量,想改变它的值可以这样写:class a (int i){i=i+1}void main:int b=3a A=new a();A.add(b);sys(b) 上面这句话,可以解释后面的那个map传递吗,请解释str1的传递和map传递的不同,谢谢。 跟堆或池没关系因为String对象不可修改值str += "def";这一句执行之后会在堆中新建一个对象,值是abcdef,再更新str的引用,而str1没有改 static void operate(StringBuffer buffer) { System.out.println(buffer==buffer1); buffer.append("def"); System.out.println(buffer==buffer1); } static void operate(String str) { System.out.println(str==str2); str+="def"; System.out.println(str==str2); } static void mapAdd(Map<String,String> map) { map.put("aa","aa"); } static StringBuffer buffer1=new StringBuffer("abc"); static String str2="abc"; public static void main(String[] args) { operate(buffer1); // str1指向了堆中new出的对象abc,像operate传递时,应该传递的是str1的引用 // 在方法中操作后,str1应该指向到操作后的新的对象,也就是abcdef System.out.println(buffer1); operate(str2); // str2为栈中的对象,传递的就是abc数值,方法操作完后,新的值仅仅是方法中的局部变量 // 值未带出到main方法中来,所以str2还应该是abc System.out.println(str2); Map<String,String> map=new HashMap<String,String>(); map.put("bb","bb"); // 这里没有疑问,mapAdd中传递的map为对象,传递的是引用,操作后map指向了操作后堆中的map值 // 操作后,main方法中map中有两队值。 mapAdd(map); for (String str : map.keySet()) { System.out.println(str); } }运行一下这个你就明白了 那么str指向了新的abcdef,出了方法之后,abcdef就可以被GC回收了吧,其实这里的最关键的就是String对象的不可改变值造成的。如果是普通new出来的对象的话,传递时,会在原对象值位置上修改,这样出了方法,修改的值还在原地址保存,就是值传递了吧,可以这样理解吧,大牛 java中关于父类中private变量的问题。 Java中float的取值范围是什么? 请教javascript 焦点问题 JTable 为什么不能正确显示列标题 什么时候用包装类,什么时候用基础类型 Java中,如何实现多文档界面中内部窗体与菜单间的联系以及如何设置背景图片详解 怎样在JAVA图形界面中嵌如其他语言写的小程序? JBuilder中用向导创了第一个窗体之后怎样创建第二个窗体? 请问如何用java实现LR(1)文法的识别? 再议,程序员=‘编码机器’? 菜鸟求助java问题, 关于按钮隐藏和JFrame的repaint()函数
至于你后面写的那个没有new对象的变量,想改变它的值可以这样写:
class a (int i)
{
i=i+1
}
void main:
int b=3
a A=new a();
A.add(b);sys(b)
因为String对象不可修改值
str += "def";
这一句执行之后会在堆中新建一个对象,值是abcdef,再更新str的引用,而str1没有改
System.out.println(buffer==buffer1);
buffer.append("def");
System.out.println(buffer==buffer1);
}
static void operate(String str) {
System.out.println(str==str2);
str+="def";
System.out.println(str==str2);
}
static void mapAdd(Map<String,String> map) {
map.put("aa","aa");
}
static StringBuffer buffer1=new StringBuffer("abc");
static String str2="abc";
public static void main(String[] args) {
operate(buffer1);
// str1指向了堆中new出的对象abc,像operate传递时,应该传递的是str1的引用
// 在方法中操作后,str1应该指向到操作后的新的对象,也就是abcdef
System.out.println(buffer1);
operate(str2);
// str2为栈中的对象,传递的就是abc数值,方法操作完后,新的值仅仅是方法中的局部变量
// 值未带出到main方法中来,所以str2还应该是abc
System.out.println(str2);
Map<String,String> map=new HashMap<String,String>();
map.put("bb","bb");
// 这里没有疑问,mapAdd中传递的map为对象,传递的是引用,操作后map指向了操作后堆中的map值
// 操作后,main方法中map中有两队值。
mapAdd(map);
for (String str : map.keySet()) {
System.out.println(str);
}
}运行一下这个你就明白了