JavaはCallBy Value?Call By Reference?


JavaはCallByvalue?Call By Reference?


以下に示すように、name propertyを持つPersonクラスを定義します.
class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

参照先の変更


まず,Person型参照変数参照のターゲットを変更する.
public class Main {
    public static void changePerson(Person param) {
        param = new Person("new Person");
    }

    public static void main(String[] args) {
        Person person = new Person("before");
        System.out.println("메서드 호출 전 " + person.getName());
        changePerson(person);
        System.out.println("메서드 호출 후 " + person.getName());
    }
}
予想される実行結果は、person変数が参照するオブジェクトをnewpersonに変更する必要があります.以下に示します.
메소드 호출 전 before
메소드 호출 후 new person
ただし、実際の実行結果は以下のようになり、person変数が参照するターゲットは変わりません.
메소드 호출 전 before
메소드 호출 후 before

参照先の属性の置換


では、参照するターゲットのproperty(すなわちname値)を変更するのはどうでしょうか.
public class Main {
    public static void changePerson(Person param) {
//        param = new Person("new Person");
        param.setName("new Person");
    }

    public static void main(String[] args) {
        Person person = new Person("before");
        System.out.println("메서드 호출 전 " + person.getName());
        changePerson(person);
        System.out.println("메서드 호출 후 " + person.getName());
    }
}

class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

実行結果
메서드 호출 전 before
메서드 호출 후 new person
nameの値が変化していることが確認できます.changePersonメソッドのパラメータparamと主関数で宣言されたpersonは同じインスタンス(before)を指すが、paramとpersonは独立した変数であると決定できる.
すなわち,chagnePersonメソッドが実行されると,personの参照値がコピーされparamのCall By Valueに渡される.