天天看點

程式設計細節 —— 按值傳遞、按引用傳遞(final、const)

  • System.out,out 是 System 類内定義的靜态 final PrinterStream 變量;
    public final class System {
        ...
        public final static PrinterStream out = null;
        ...
    }
               

0. 總論

  • 注意區分 Java 的按值傳遞和按引用傳遞,但使用按引用傳遞時,被調端不會對(沒有能力)對調用端造成任何影響,
  • 按引用傳遞便具備對調用端造成影響的能力,如果在按引用傳遞的情況下,還想保證不會對調用端産生任何影響,此時便可以使用 final 關鍵字(C/C++ 則是 const 關鍵字)修飾參數;

1. 按值傳遞

當傳遞的是一個對象時:

class Test{
    private int i = ;

    public Test(int i) {
        this.i = i;
    }
    // setI, getI
}

public class PassByValue {
    private static void update(Test t) {
        t = new Test();   // t.setI(20); 注意二者的差別
        System.out.println(t.getI());
    }

    public static void main(String[] args) {
        Test t = new Test();

        System.out.println(t.getI());      // 10
        update(t);                         // 20
        System.out.println(t.getI());      // 10 仍然是 10 
    }
}
           

當然也可以直接輸出對象:

public class PassByValue {
    private static void update(Test t) {
        t = new Test();
        System.out.println(t);
    }

    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t);      // [email protected]
        update(t);                  // [email protected]
        System.out.println(t);      // [email protected]
    }
}