メソッドで渡される変数を変更したのに、なぜ変更できないのですか?


Question
Q1. 特定のメソッドに渡されるパラメータ[inta=10]を1000に変更します.
しかしなぜ変更が「ダメ」なのでしょうか?
class Data {
    int x;
}

public class Main {
    public static void main(String[] args) {
        Data data = new Data();
        data.x = 10;
        change(data.x);

        System.out.println(data.x);
    }

    static void change(int a) {
        a = 1000;
    }
}
10
Q2. 特定のメソッドに渡されるパラメータ[inta=10]を1000に変更します.
しかしなぜ、変更は「できる」のでしょうか.
class Data {
    int x;
}

public class Main {
    public static void main(String[] args) {
        Data data = new Data();
        data.x = 10;
        change(data);

        System.out.println(data.x);
    }

    static void change(Data a) {
        a.x = 1000;
    }
}
1000
Answer
  • java変数は2つのクラスに分けることができます.基本型(primitive type)と参照型(reference type).
  • 基本型は私たちがよく知っている[byte、short、int、long、short、long、booleanなど].
  • を除いて、すべてのタイプは参照型です.
  • 両者の違いはいろいろありますが、この文章の質問に答えるためには、一つのことを知るだけです.基本型は実際のデータの値を格納し、参照型はデータのメモリアドレスを格納する.
  • Q1 Answer
  • Q 1でchange(int b)メソッドが呼び出されるにつれて、data.x値はパラメータaにコピーされる.
  • data.xとaは同じ値のみで、異なるメモリアドレスに格納されます.
  • データは
  • aの値を1000に変更します.xには影響しません.
  • Q2 Answer
  • データは参照型です.
  • Q 2「変更」(Data a)メソッドを呼び出し、データのメモリアドレスをパラメータaにコピーする.
  • パラメータaは、データのようなオブジェクトを指す.
  • bの変更によりaに反映される.
  • 参考資料
  • ジャワの晶石、南宮星知音.
  • https://docs.oracle.com/javase/specs/jvms/se16/html/jvms-2.html#jvms-2.4