今天去面试。其中面试问到一个问题是方法之间值传递问题。
问方法testa 输出的是什么。当时一时忘记了。
public static void testa(){
String a = "a";
StringBuffer b = new StringBuffer("b");
System.out.println(a);
System.out.println(b);
testb(a,b);
System.out.println(a);
System.out.println(b);
}
public static void testb(String a ,StringBuffer b){
a = a+"a";
b.append("b");
}
回来赶紧查查资料
“Java方法中传进去一个对象,为什么不能改变这个对象”的问题。
总结:
第一:java方法基本数据类型是传值,对象类型传引用,这是千真万确的。
第二:当参数是对象时,无论方法体内进行了何种操作,都不会改变实参对象的引用。
第三:当参数是对象时,只有在方法内部改变了对象的内容时,才会改变实参对象内容。
public static void main(String[] args) {
//1,基本数据类型:传值,方法不会改变实参的值。
int i = 1;
System.out.println(i);
changeInt(i);
System.out.println(i);
//2,引用类型 String 改变其指向
String s = "s";
System.out.println(s+""+s.hashCode());
changeString(s);
System.out.println(s+""+s.hashCode());
//3,引用类型 StringBuffer 改变对象的内容时
StringBuffer sb = new StringBuffer("sb");
System.out.println(sb+""+sb.hashCode());
changeRefence(sb);
System.out.println(sb+""+sb.hashCode());
}
public static void changeInt(int i){
i = 10;
}
public static void changeString(String s){
s = "ss";
System.out.println(s+""+s.hashCode());
}
public static void changeRefence(StringBuffer sb){
sb.append(" change");
sb = new StringBuffer("aaaaaaaaaa");
System.out.println(sb+""+sb.hashCode());
}
输出结果如下
运行时内存区域 内存图