※ 引述《Arim (Arim5566)》之銘言:
: //test2.java
: 1 public class test2
: 2 {
: 3 public static void main(String[] args) {
: 4 Integer i=new Integer(5);
: 5 System.out.println(i);
: 6 some(i);
: 7 System.out.println(i);
: 8 }
: 9 private static void some(Integer j)
: 10 {
: 11 j=50;
: 12 }
: 13 }
: Output出來的結果,i仍然是5
: 不過Integer不是屬於物件型態嘛?
: 那為什麼在這個例子,仍然相當於c++的傳值呼叫?
: 做所謂的裝箱動作不就是為了要有傳參考的效果嘛?
有兩件事你需要注意:
1. Integer, Character, Double, ...
這些 Wrapper 物件都有個特性叫做 Immutable,
你沒有辦法去修改這些物件所代表的值。
String 也有 Immutable 的特性,我用它來舉個例:
String s1 = "foo";
s1 += "bar";
第二行看起來很像是把 "bar" 接到 s1 後面,
但其實是另外生成了一個內容為 "foobar" 的 String 物件,
而原本的 foo 物件其實還在。 (只是不再被 reference 了)
2. j = 50 這行用了另一個特性叫做 Auto-Boxing,
其實等同於 j = new Integer(50) ,
所以當執行完這一行後,j 指向的是新的物件,而 i 指的還是原來的物件。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.122.183.195
※ 編輯: tkcn 來自: 140.122.183.195 (09/15 23:11)
推
09/15 23:24, , 1F
09/15 23:24, 1F
推
09/19 20:16, , 2F
09/19 20:16, 2F
討論串 (同標題文章)