public class Hello {
public static void main(String[] args) {
String s = "123";
System.out.println(s);
m1(s);
System.out.println(s); int i = 123;
System.out.println(i);
m2(i);
System.out.println(i);
} private static void m1(String s) {
s = "321";
} private static void m2(int i) {
i = 321;
}
}
public static void main(String[] args) {
String s = "123";
System.out.println(s);
m1(s);
System.out.println(s); int i = 123;
System.out.println(i);
m2(i);
System.out.println(i);
} private static void m1(String s) {
s = "321";
} private static void m2(int i) {
i = 321;
}
}
m1? m2?是不是没有输出任何东西呀!
m1(s); 只是将s 的引用传过去了,而方法 m1(s); 将m1中参数s的引用该为“321”执行之后都释放掉了,而原来的s还是指向“123”没有改变,下面的类同,要想改变s应该用set方法
将m1中参数s就原来的s不指向同一个地址。原来的s的没有改变过。
123
321
123
123吧!
string 为引用类型
int 是值类型
分析其内存:
String s ="123"
在栈里有个String类型变量s,在共享池里有对象"123",
s引用指向"123";
执行m1(s)方法时,这时也在栈里有另一个s(不同于mai()方法里的),其先指向
"123",然后来指向"321";此方法结束后,此引用s也消失。
所以打印的s还是mai()方法里的s="123";
如果不是String,比如
class TestObject {
public String version = "1";
}//
TestObject s = new TestObject();
System.out.println(s.version);
ml(s);
System.out.println(s.version);
...void ml(TestObject s){
s.version="2";
}此时 s 对应的对象就被修改了,输出:
1
2
m2 因为int是简单类型,作参数时是值传递,不可能因为作参数而改变原来的值。这个大家都对