1. 程式人生 > 實用技巧 >Java 引數繫結

Java 引數繫結

學習廖雪峰老師的JAVA教程的筆記

基本型別引數繫結

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        int n = 15; // n的值為15
        p.setAge(n); // 傳入n的值
        System.out.println(p.getAge()); // 15
        n = 20; // n的值改為20
        System.out.println(p.getAge()); // 15還是20?
    }
}

class Person { private int age; public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } }

輸出

15

15

結論:基本型別引數的傳遞,是呼叫方值的複製。雙方各自的後續修改,互不影響。

引用型別引數繫結

public class Main {
    public static void main(String[] args) {
        Person p 
= new Person(); String[] fullname = new String[] { "Homer", "Simpson" }; p.setName(fullname); // 傳入fullname陣列 System.out.println(p.getName()); // "Homer Simpson" fullname[0] = "Bart"; // fullname陣列的第一個元素修改為"Bart" System.out.println(p.getName()); // "Homer Simpson"還是"Bart Simpson"?
} } class Person { private String[] name; public String getName() { return this.name[0] + " " + this.name[1]; } public void setName(String[] name) { this.name = name; } }

輸出:

HomerSimpson
BartSimpson

結論:引用型別引數的傳遞,呼叫方的變數,和接收方的引數變數,指向的是同一個物件。雙方任意一方對這個物件的修改,都會影響對方

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        String bob = "Bob";
        p.setName(bob); // 傳入bob變數
        System.out.println(p.getName()); // "Bob"
        bob = "Alice"; // bob改名為Alice
        System.out.println(p.getName()); // "Bob"還是"Alice"?
    }
}

class Person {
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

輸出

Bob
Bob

筆記:

引用型別引數傳遞傳的都是地址

name=fullname,它們指向的是同一個陣列的地址,所以fullname改變陣列元素時,name的陣列元素也會改變(因為它們指向的是同一個陣列)

name=bob,一開始name指向 “bob指向的地址”,也就是"BOB"這個物件的地址

bob = "Alice",此時bob指向的地址改變了,但是name依舊指向的是"BOB"這個物件的地址