ホームページ >Java >&#&チュートリアル >Java の参照型の概念を分析する
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); } }
Java プログラミング言語では、クラスの型で宣言された変数は、非クラスを参照しているため、参照型として指定されます。これは代入に重要な意味を持ちます。次のコード:
int x = 7; int y = x; String s = "Hello"; String t = s;
変数 t が t="World" として再定義されると、新しいオブジェクト World が作成され、t はこのオブジェクトを参照します。
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 を仮パラメータと呼びます。 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; }
参照渡しのプロセスを正しく理解するには、メモリ割り当てのプロセスを理解する必要があります。メモリ割り当て図は、このプロセスを理解するのに役立ちます。
上記の例を使用して分析します:
(1) 実行を開始し、8 行目を実行し、A のインスタンスを作成します。メモリ割り当て図は次のとおりです:
メイン メソッドの a
(2)、実行9 行目、インスタンス A の age の値を変更します。メモリ割り当て図は次のとおりです。メイン メソッドの 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实例,内存分配示意图如下:
(2)、运行第10行,是修改A实例里面的age的值,运行后内存分配示意图如下:
(3)、运行第11行,是把mian方法中的变量a所引用的内存地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
(4)、运行第3行,为test1方法中的变量a重新生成了新的A实例,完成后形成的新的内存示意图如下:
(5)、运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成新的内存示意图如下:
注意:这个时候test1方法中的变量a的age被改变,而main方法中的a变量是没有改变的。
(6)、运行第5行,根据此时的内存示意图,输出test1方法中的age=20
(7)、运行第12行,根据此时的内存示意图,输出main方法中的age=10
说明:
(1)、“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2)、在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义的字符串方式:String str = "Java快车";
相关文章:
以上がJava の参照型の概念を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。