將句柄傳遞進入一個方法時,指向的仍然是相同的對象。一個簡單的實驗可以證明這一點(若執行這個程序時有麻煩,請參考第3章3.1.2小節“賦值”):
//: PassHandles.java // Passing handles around package c12; public class PassHandles { static void f(PassHandles h) { System.out.println("h inside f(): " + h); } public static void main(String[] args) { PassHandles p = new PassHandles(); System.out.println("p inside main(): " + p); f(p); } } ///:~
toString方法會在打印語句裡自動調用,而PassHandles直接從Object繼承,沒有toString的重新定義。因此,這裡會采用toString的Object版本,打印出對象的類,接著是那個對象所在的位置(不是句柄,而是對象的實際存儲位置)。輸出結果如下:
p inside main(): PassHandles@1653748
h inside f() : PassHandles@1653748
可以看到,無論p還是h引用的都是同一個對象。這比復制一個新的PassHandles對象有效多了,使我們能將一個參數發給一個方法。但這樣做也帶來了另一個重要的問題。