sh首先看一下这段代码和运行结果:
public class TestInteger {
public static void main(String[] args) {
Integer a = 129;
Integer b = 200;
System.out.println("交换前:" + "a = " + a + " " + "b = " + b);
swap(a, b);
System.out.println("交换后:" + "a = " + a + " " + "b = " + b);
String string1 = "1";
String string2 = "2";
System.out.println("交换前:" + "string1 = " + string1 + " " + "string2 = " + string2);
swapStr(string1, string2);
System.out.println("交换后:" + "string1 = " + string1 + " " + "string2 = " + string2);
MyString myString1 = new MyString("1");
MyString myString2 = new MyString("2");
System.out.println("交换前:" + "myString1 = " + myString1 + " " + "myString2 = " + myString2);
swapMyStr(myString1, myString2);
System.out.println("交换后:" + "myString1 = " + myString1 + " " + "myString2 = " + myString2);
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("hello");
System.out.println("before = " + stringBuffer.toString());
stringBufferNew(stringBuffer);
System.out.println("afterStringBufferNew = " + stringBuffer.toString());
stringBufferAppend(stringBuffer);
System.out.println("afterStringBufferAppend = " + stringBuffer.toString());
}
private static void swap(Integer numA, Integer numB) {
Integer temp = numA;
numA = numB;
numB = temp;
}
private static void swapStr(String string1, String string2) {
String temp = string1;
string1 = string2;
string2 = temp;
}
private static void swapMyStr(MyString myString1, MyString myString2) {
myString1 = null;
myString2 = null;
}
private static void stringBufferAppend(StringBuffer stringBuffer) {
stringBuffer.append(" world");
}
private static void stringBufferNew(StringBuffer stringBuffer) {
stringBuffer = new StringBuffer();
stringBuffer.append(" world");
}
static class MyString {
public MyString(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "MyString{" +
"name='" + name + '\'' +
'}';
}
}
}
运行结果:
交换前:a = 129 b = 200
交换后:a = 129 b = 200
交换前:string1 = 1 string2 = 2
交换后:string1 = 1 string2 = 2
交换前:myString1 = MyString{name='1'} myString2 = MyString{name='2'}
交换后:myString1 = MyString{name='1'} myString2 = MyString{name='2'}
before = hello
afterStringBufferNew = hello
afterStringBufferAppend = hello world
你分析对输出结果了没有?java中是值传递还是引用传递?
在我看来,java中都是值传递,引用传递也是值传递的一种。当某个变量作为参数传入方法时,其实是复制了变量的值到栈中,修改参数值,就是修改已经复制出来的变量的值,原变量值不变。当传入的是对象的引用,对引用变量做了赋值操作,也和值传递一样,只改变了copy的变量值,真实值不变。若是修改引用对象的值,则已经将对象修改,所以对象修改生效。