Java の参照型の概念を分析する

阿神
リリース: 2017-03-18 13:56:42
オリジナル
1493 人が閲覧しました

1. 参照型とは何ですか? 参照型は、プリミティブ値ではなく、オブジェクトを指します。 Java では、基本データ型以外の型は参照データ型であり、定義したクラスは基本型と同様に使用できます。 例は次のとおりです:

    public class MyDate {
        private int day = 8;
        private int month = 8;
        private int year = 2008;
        private MyDate(int day, int month, int year){...}
        public void print(){...}
    }
    public class TestMyDate {
        public static void main(String args[]) {
            //这个today变量就是一个引用类型的变量
            MyDate today = new MyDate(23, 7, 2008);
        }
    }
ログイン後にコピー


2. 参照型の割り当て

Java プログラミング言語では、クラスの型で宣言された変数は、非クラスを参照しているため、参照型として指定されます。これは代入に重要な意味を持ちます。次のコード:

    int x = 7;
    int y = x;
    String s = "Hello";
    String t = s;
ログイン後にコピー

4 つの変数 (2 つのプリミティブ型 int と 2 つの参照型 String) が作成されます。 x の値は 7 で、この値は y にコピーされます。x と y は 2 つの独立した変数であり、どちらかをさらに変更しても他方には影響しません。変数 s と t に関しては、「Hello」というテキストを含む String オブジェクトが 1 つだけ存在し、s と t の両方がこの 1 つのオブジェクトを参照します。


変数 t が t="World" として再定義されると、新しいオブジェクト World が作成され、t はこのオブジェクトを参照します。 Java の参照型の概念を分析する

Java の参照型の概念を分析する

3. 値渡しと参照渡しの違い

1) 値渡し
は、メソッドが呼び出されるときに、渡されるパラメーターが値渡しのコピーによって渡されることを意味します。例は次のとおりです。

public class TempTest {
    private void test1(int a) {
        // 做点事情
        a++;
    }
   
    public static void main(String args[]) {
        TempTest t = new TempTest();
        int a = 3;
         t.test1(a);//这里传递的参数a就是按值传递。
         System.out.printIn("main方法中的a===" + a);
      }
  }
ログイン後にコピー

値渡しの重要な特徴: 渡されるのは値のコピーであり、渡された後は無関係であることを意味します。 9 行目の a と 2 行目の a は 2 つの変数であり、2 行目の a の値が変更されても、9 行目の a の値は変更されないため、出力結果は 3 になります。
main メソッドの a は 3 です

test1 メソッドの a は 4 です

基本的なデータ型の場合、9 行目の a を実パラメータ、2 行目の a を仮パラメータと呼びます。 data 変更は実際のパラメータデータには影響しません。

2) 参照渡し

は、メソッドが呼び出されるときに、渡されるパラメーターが参照によって渡されることを意味します。実際に渡されるのは、変数に対応するメモリ空間のアドレスである参照のアドレスです。 。 例は次のとおりです:

public class TempTest {
    private void test1(A a) {
        a.age = 20;
        System.out.printIn("test1方法中的age="+a.age);
    }
    public static void main(String args[]) {
        TempTest t = new TempTest();
        A a = new A();
        a.age = 10;
        t.test1(a);// 这里传递的参数a就是按引用传递
           System.out.printIn("main方法中的age="+a.age);
      }
  }
  classA {
      public int age = 0;
  }
ログイン後にコピー

実行結果は次のとおりです: test1 メソッドの age = 20 main メソッドの age = 20
参照渡しの重要な機能:

渡されるのは値への参照です。つまり、渡す前後で、それらはすべて同じ参照(つまり、同じメモリ空間)を指します。

参照渡しのプロセスを正しく理解するには、メモリ割り当てのプロセスを理解する必要があります。メモリ割り当て図は、このプロセスを理解するのに役立ちます。
上記の例を使用して分析します:
(1) 実行を開始し、8 行目を実行し、A のインスタンスを作成します。メモリ割り当て図は次のとおりです:
メイン メソッドの a



(2)、実行9 行目、インスタンス A の age の値を変更します。メモリ割り当て図は次のとおりです。メイン メソッドの a Java の参照型の概念を分析する


(3)、10 行目で実行、メイン メソッドの変数 a を参照します。メモリ空間アドレスは、参照によって test1 メソッドの変数に渡されます。注意してください: これら 2 つの a 変数は完全に異なります。同じ名前に騙されないでください。しかし、これらは同じ A インスタンスを指します。メモリ割り当て図は次のとおりです:

Java の参照型の概念を分析する

Java の参照型の概念を分析する


(4) 行 3 を実行し、test1 メソッドの変数 a を A インスタンスの年齢に割り当てます。は次のように形成されます:


此时A实例的age值的变化是由test1方法引起的。
(5)、运行第4行,根据此时的内存示意图,输出test1方法中的age=20
(6)、运行第11行,根据此时的内存示意图,输出main方法中的age=20
3)对上述例子的改变
理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面的呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:

public class TempTest {
    private void test1(A a) {
        a = new A();// 新加的一行
        a.age = 20;
        System.out.printIn("test1方法中的age="+a.age);
    }
    public static void main(String args[]) {
        TempTest t = new TempTest();
        A a = new A();
         a.age = 10;
        t.test1(a);// 这里传递的参数a就是按引用传递
           System.out.printIn("main方法中的age="+a.age);
      }
  }
  classA {
      public int age = 0;
  }
ログイン後にコピー

 运行结果为:test1方法中的age=20  main方法中的age=10
    实现了按引用传递的值传递前与传递后互不影响,还是使用内存示意图来理解一下:
    (1)、运行开始,运行第9行,创建了一个A实例,内存分配示意图如下:

Java の参照型の概念を分析する

(2)、运行第10行,是修改A实例里面的age的值,运行后内存分配示意图如下:

Java の参照型の概念を分析する


(3)、运行第11行,是把mian方法中的变量a所引用的内存地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。

Java の参照型の概念を分析する

(4)、运行第3行,为test1方法中的变量a重新生成了新的A实例,完成后形成的新的内存示意图如下:

Java の参照型の概念を分析する

(5)、运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成新的内存示意图如下:

1Java の参照型の概念を分析する

注意:这个时候test1方法中的变量a的age被改变,而main方法中的a变量是没有改变的。
     (6)、运行第5行,根据此时的内存示意图,输出test1方法中的age=20
     (7)、运行第12行,根据此时的内存示意图,输出main方法中的age=10
    说明:
    (1)、“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
    (2)、在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义的字符串方式:String str = "Java快车";

相关文章:

Java四种引用类型的具体介绍

详细比较Java中的基本类型变量和引用类型变量

JavaScript 基本数据类型和引用类型的区别详解

以上がJava の参照型の概念を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート