Java メソッドでパラメータを渡すことへの参照は本当にあるのでしょうか?

データの種類

Java のデータ クラスは、プリミティブ型と参照型の 2 つのカテゴリに分類できます。

基本的な型には、整数 (byte、short、int、long)、浮動小数点 (float、double)、文字 (char)、ブール (boolean) が含まれます。

参照型には、クラス、インターフェイス、配列が含まれます。

Java を紹介する多くの記事では、Java メソッドには値の受け渡しと参照の受け渡しという 2 つの方法でパラメーターを渡すことができると書かれています。

本当にパラメータを渡す方法が 2 つあるのでしょうか?

まず、基本型と参照型がメモリにどのように格納されるかを見てみましょう。

基本タイプ

基本タイプの変数は、変数の値をメモリに直接格納します (例: int a = 1;
その後、a に対応するメモリ ユニットには 1 が格納されます)。
Java プログラミングの美しさ
(画像出典: Wang Zheng「The Beauty of Java Programming」https://www.xzgedu.com/detail/p_625cfab5e4b01a4851f30d8a/6)

参照型

参照型変数にはオブジェクト自体は格納されませんが、オブジェクトが配置されているメモリ ブロックの最初のアドレスが格納されます。
Student stu = new Student(1,3);
stu は、参照型の変数として、Student オブジェクトの最初のアドレスをメモリに格納します。
ここに画像の説明を挿入
(画像出典: Wang Zheng「The Beauty of Java Programming」https://www.xzgedu.com/detail/p_625cfab5e4b01a4851f30d8a/6)

メソッドパラメータ

メソッドのパラメータが基本型の場合、メソッドが呼び出されるときに、メモリ内の変数の値がメソッドのパラメータにコピーされます。つまり、change(a) メソッドは、次の値 1 をコピーします。メモリ内の a を変数 x に代入します。

x はメソッド変更のローカル変数であるため、変更メソッド スタックに格納され、メイン メソッド スタックに格納されている a 変数には影響を与えないため、出力結果は 1 になります。

 public static void main(String[] args) {
    
    
        int a = 1;
        change(a);
        System.out.println(a); // 输出结果为1
    }

    public static void change(int x) {
    
    
        x = 2;
    }

メソッドのパラメータが参照型の場合、メソッドが呼び出されるときに、メモリ内の変数の値もメソッドのパラメータにコピーされます。つまり、change(stu) メソッドは、メモリ内の stu の値をコピーします。メモリ ( Student オブジェクト. Addressの最初の値) のコピーを変数 stux にコピーします。

このように、メモリ上の変数 stu と変数 stux の値は同じであり、両方とも Student オブジェクトの先頭アドレス、つまり変数 stu と変数の値になります。 stux は同じ Student オブジェクトを指します。

したがって、change メソッドでは、変数 stux が指すオブジェクトの属性 age を変更します。つまり、変数 stux が指すオブジェクトの属性 age は、同じオブジェクトを指しているため変更されます。

 public static void main(String[] args) {
    
    
        Student stu = new Student(1,20);
        change(stu);
        System.out.println(stu.age); // 输出结果为18
    }

    public static void change(Student stux) {
    
    
        stux.age = 18;
    }

    static class Student {
    
    
        int id;
        int age;
        public Student(int id,int age) {
    
    
            this.id = id;
            this.age = age;
        }
    }

要約する

まとめると、メソッドのパラメータの型が基本型であるか参照型であるかに関係なく、メモリ内の変数の値を渡しますが、メモリ内の基本型の値は値そのものであり、参照型はメモリ内の値です。オブジェクトの最初のアドレスをメモリに保存する これですべてです。

そのため、Java言語ではメソッドのパラメータの受け渡しは、基本型でも参照型でも値渡しとなり、変数の値が渡されます。

では、なぜ C++ は参照渡しなのでしょうか?

C++ は「&」参照を通じて変数のアドレスを取得できるため、変数のアドレスを関数に渡すことができます。

説明する画像をインターネットからランダムに見つけます:
ここに画像の説明を挿入
C++ 参照転送、変数自体のアドレスが渡されます: 0x7fff5cc109de

Java は変数の値 10 を転送します
(参照型の変数の場合、変数の値はオブジェクトの最初のアドレスになります。何があっても、変数の値が渡されます)。

したがって、Java は参照渡しではなく、値渡しのみを行います。

おすすめ

転載: blog.csdn.net/zhanyd/article/details/124629099