Javaにおけるパラメータ転送とメモリ割り当ての問題について

5137 ワード

まずコードを見てみましょう
package my.java.test;

public class Parameter {
    static class Year {
        private int year;

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public Year(int year) {
            this.year = year;
        }
    }

    static void change_1(Year year) {
        year.setYear(2019);
    }

    static void change_2(Year year) {
        year = new Year(2020);
    }

    public static void main(String[] args) {
        Year thisYear = new Year(2018);
        System.out.println(thisYear.getYear());
        change_1(thisYear);
        System.out.println(thisYear.getYear());


        change_2(thisYear);
        System.out.println(thisYear.getYear());
    }
}

実行結果:
201820192019
Process finished with exit code 0
誰かが悩んでいるかもしれませんが、なぜchange_2役に立たないクラス、私たちが伝えているのは引用タイプではありませんか.同じオブジェクトを指しているのではないでしょうか.道理で変わるはずですが、ここを見たとき、javaのパラメータの渡しとメモリの割り当てについて理解してみてください.
1,javaでは,基本タイプと参照タイプの2種類の変数があるが,基本タイプは値の伝達(すなわち,字面値を1回コピー)であり,参照タイプは参照の伝達であり,伝達参照とは,譲方法のパラメータと呼び出し方法の際に伝達する実パラメータが同じオブジェクトを指すことを知っている.
2,javaでメソッドのパラメータ伝達が基本タイプでも参照タイプでもメモリのコピーで実現されていることを知っていれば、何のchange_を理解できます.2、効果がありません.まず、メモリレプリケーションとは何かについてお話しします.change_を呼び出すと1の場合、実パラメータが入力されchange_1のメソッド定義:
static void change_1(Year year)

カッコの内部に変数yearが申請されました.これはローカル変数です.jvmは、実パラメータで入力した参照をこの新しい申請の参照にコピーします.つまり、カッコの内部で定義された参照変数と、メソッドを呼び出すときに入力したパラメータは同じオブジェクトを指しますが、彼らは別の関連のない参照変数です.同じメモリアドレスを指しているだけで、いずれかを操作するとオブジェクトの値が変更されます.
しかし、この新しい申請の参照を新しいオブジェクト、すなわちchange_に向けると2、このアプリケーションは新しいメモリアドレスを再び指し、change_を呼び出すと2メソッドによるchange_2のパラメータが指すメモリアドレス(あなたが入力した参照が指すオブジェクト)はまだ使用されていません.パラメータを新しいオブジェクトに指向させます.このパラメータはあなたが入力した実パラメータとは何の関係もありません.彼らはそれぞれ異なるオブジェクトを指向しています.だから、change_2効果なし、しかもchange_2のパラメータ定義にグレー(すなわち未使用)が表示されるのは、(元のメモリアドレスを使用するオブジェクトがまだ使用されていないため、新しいオブジェクトを再び指すためである).