' P '

whatever I will forget

Java Value(Primitive) Type と Reference Type

くーこれはテストにでそうないやらしい仕様だ!(CSとか学んでるとこんなの普通?)

Value(Primitive) Type

int, double, float, bool, charに関してはこのタイプになるらしい。
関数内で値を変更しても、元々の変数の内容は変わらないよ、ってことになります。
関数が使用しているのは、パラメータとして受け取る値のため。
下記コードの結果は0になります

public class Value_Type {
    public static void main (String args[]) {
        int i = 0;
        add_plus_one(i);
        System.out.println(i);
    }
    static void add_plus_one(int value) {
        value += 1;
    }
}

追記 3/12/22

上記よりさらに簡単な例は下記.

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = a;
        int a = 100;
    }
}

こうなると、aは100, bは10です。
なぜ?
Primitive型の変数は、メモリ上ではaはアドレス100番地、bはアドレス101番地に保存されるから。
aの値が変更されても、bのアドレス(参照ポイント)とは違うためにbの値は変わらない。

Reference Type

Classのオブジェクト、array, Stringもこのタイプ。
簡単にいうと変数を関数などに投げると、アドレス(メモリ参考地点)を渡すタイプのやつ
下記は、表示される値はhappy_birthday関数が呼ばれる前は20だが、関数コール後は21となります。

Person.java

public class Person {
    private String name;
    private int age;
    Person() {
        name = "";
        age = 0;
    }
    Person(String str, int value) {
        name = str;
        age = value;
    }
    public void setAge(int value) {
         this.age  = value;
    }
    public int getAge() {
        return this.age;
    }
}

Reference_Type.java

public class Reference_Type {
    public static void main (String args[]) {
        Person Manko_san = new Person("Manko", 20);
        System.out.println(Manko_san.getAge());
        happy_birthday(Manko_san);
        System.out.println(Manko_san.getAge());
    }
    static void happy_birthday(Person p) {
        p.setAge(p.getAge()+1);
    }
}

追記 3/12/22

上の例でもいいんだけどもっとわかりやすいのは下記かも。 alexはPerson objectを参照している。alexはアドレス番地201, Person Objectは200番地に存在する。
johnもPerson objectを参照している。john自身は202番地に存在する。
イニシャルobjectを参照しているalexのname変数を変えたらどうなるか。
もちろんjohnの値も変わる。johnの値を変えても同じ。何故ならjohnもイニシャルオブジェクトを参照しているからだ。

public class Main {
    public static void main(String[] args) {
        Person alex = new Person("alex");
        Person john = alex;
        System.out.println(before);
        System.out.println(alex.name + " : " + john.name); // both names are alex
        alex.name = "david";
        System.out.println(after);
        System.out.println(alex.name + " : " + john.name); // both names are david
    }
    
    static class Person {
        String name;

        Person(String name) {
             this.name = name;
        }
    }
}