作者darkk6 (Mr. Pan)
看板java
标题Re: [问题] 请教String的问题
时间Thu Dec 18 15:34:58 2014
问题和 String 的 Immutable 比关系较无关(应该说较少),主要是 Method 的
Pass by value 问题
底下用简单的图解来表示变数与记忆体之间的关系:
====================================================================
public static void main(String[] args){
String str1 = "Hello";
System.out.println(str1);
str1 ──┐
tell(str1);
↓
System.out.println(str1);
┌───┐
}
│Hello │
└───┘
public static void tell(String str2){
str2 = "kdok123";
}
====================================================================
public static void main(String[] args){
String str1 = "Hello";
System.out.println(str1); str1 ──┐
tell(str1); ↓
System.out.println(str1); ┌───┐
} │Hello │
└───┘
//传递给 tell 的 是这个 "Hello" String 的位置 ↑
public static void tell(String str2){
str2 ────┘
str2 = "kdok123";
}
====================================================================
public static void main(String[] args){
String str1 = "Hello";
System.out.println(str1); str1 ──┐
tell(str1); ↓
System.out.println(str1); ┌───┐
} │Hello │
└───┘
//传递给 tell 的 是这个 "Hello" String 的位置 ┌────┐
public static void tell(String str2){ str2 ───
──→│kdok123 │
str2 = "kdok123"; └────┘
}
// 因为字串的 Immutable 所以会
// 指向另一个物件
====================================================================
回到 main ,你看到 str1 指向哪个物件呢 ?
接着看 ex2 : ┌──┐
┌─────┐│kdok│
public static void main(String[] args){
│Object Ex2│└──┘
Ex2 e1 = new Ex2(); e1 ──→╞═════╡ ↑
e1.temp = "kdok"; │ temp ─┼─┘
System.out.println(e1.temp);
└─────┘
tell(e1);
System.out.println(e1.temp);
}
public static void tell(Ex2 str2){
str2.temp = "kdok123";
}
============================================================================
┌──┐
┌─────┐│kdok│
public static void main(String[] args){ │Object Ex2│└──┘
Ex2 e1 = new Ex2(); e1 ──→╞═════╡ ↑
e1.temp = "kdok";
┌───→│ temp ─┼─┘
System.out.println(e1.temp);
│ └─────┘
tell(e1); │
System.out.println(e1.temp);
│
}
│
│
public static void tell(Ex2 str2){
│
str2.temp = "kdok123";
str2 ┘
}
============================================================================
┌──┐
┌─────┐│kdok│
public static void main(String[] args){ │Object Ex2│└──┘
Ex2 e1 = new Ex2(); e1 ──→╞═════╡
e1.temp = "kdok"; ┌───→│ temp
─┼─┐
System.out.println(e1.temp); │ └─────┘
│
tell(e1); │
↓
System.out.println(e1.temp); │
┌────┐
} │
│kdok123 │
│
└────┘
public static void tell(Ex2 str2){ │
str2.temp = "kdok123"; str2 ┘
}
// 因为字串的 Immutable 所以会
// 指向另一个物件
============================================================================
回到 main , 你看到 e1.temp 是指向哪个物件呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.164.118.189
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1418888100.A.52D.html
1F:推 kdok123: 感谢! 这边我有理解,可是我没有理解我的问题(上一篇) 12/18 15:40
2F:→ kdok123: 若是字串的immutable特性,那为什麽改成Integer还是跟 12/18 15:40
3F:→ kdok123: String有一样的结果呢?(ex1) 12/18 15:40
4F:推 LaPass: 楼上,你没看懂这一篇,看懂就能理解了。 12/18 15:42
5F:→ LaPass: 所谓的「不能修改」不是指「不能修改那个变数」 12/18 15:43
6F:→ LaPass: 先搞懂 pass by reference、pass by value 这个观念 12/18 15:44
7F:→ LaPass: 再来看这个,会比较好懂 12/18 15:44
8F:推 LaPass: 还有那不是String的特性,你把它改成int的结果应该会一样 12/18 15:47
9F:→ bleed1979: 不对人但对楼上,换int和换Integer应该是不同的。 12/19 07:23