12.1 传递指针
12.1 传递指针
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); } } ///:~
public class Alias1 { int i; Alias1(int ii) { i = ii; } public static void main(String[] args) { Alias1 x = new Alias1(7); Alias1 y = x; // Assign the handle System.out.println(“x: " + x.i); System.out.println(“y: " + y.i); System.out.println(“Incrementing x”); x.i++; System.out.println(“x: " + x.i); System.out.println(“y: " + y.i); } } ///:~
对下面这行:
Alias1 y = x; // Assign the handle
它会新建一个
此时最直接的一个解决办法就是干脆不这样做:不要有意将多个指针指向同一个作用域内的同一个对象。这样做可使代码更易理解和调试。然而,一旦准备将指针作为一个自变量或参数传递——这是
public class Alias2 { int i; Alias2(int ii) { i = ii; } static void f(Alias2 handle) { handle.i++; } public static void main(String[] args) { Alias2 x = new Alias2(7); System.out.println(“x: " + x.i); System.out.println(“Calling f(x)”); f(x); System.out.println(“x: " + x.i); } } ///:~
输出如下: x: 7 Calling f(x) x: 8
方法改变了自己的参数——外部对象。一旦遇到这种情况,必须判断它是否合理,用户是否愿意这样,以及是不是会造成问题。
通常,我们调用一个方法是为了产生返回值,或者用它改变为其调用方法的那个对象的状态(方法其实就是我们向那个对象“发一条消息”的方式