1: ما الذي يمر بالقيمة
وهذا يعني أنه عندما يتم استدعاء طريقة ، يتم تمرير المعلمات التي تم تمريرها عن طريق نسخة من القيمة. الأمثلة على النحو التالي:
الفئة العامة tertest {private void test1 (int a) {// افعل شيئًا} الفراغ الثابت العام الرئيسي (string [] args) {treatest t = new treptest () ؛ int a = 3 ؛ T.Test1 (A) ؛ // المعلمة A التي تم تمريرها هنا هي تمريرها بالقيمة}}الخصائص المهمة للمرور حسب القيمة: ما تم تمريره هو نسخة من القيمة ، مما يعني أنها لا تتعلق ببعضها البعض بعد المرور.
الأمثلة على النحو التالي:
الفئة العامة إغراء {private void test1 (int a) {a = 5 ؛ System.out.println ("Test1 method a ="+a) ؛ } public static void main (string [] args) {temptest t = new tremptest () ؛ int a = 3 ؛ T.Test1 (A) ؛ // بعد المرور ، لا يؤثر تغيير القيمة المتغيرة لطريقة Test1 على system.out.println ("الطريقة الرئيسية A ="+A) ؛ }}نتيجة العملية هي:
A = 5 في Test1 Method A = 3 في الطريقة الرئيسية
2: ما الذي يمر بالرجوع إليه
ويشير إلى المعلمات التي تم تمريرها عند استدعاء الطريقة ، ويتم تمرير المعلمات التي تم تمريرها بالرجوع إليها. في الواقع ، فإن العنوان المرجعي الذي تم تمريره هو عنوان مساحة الذاكرة المقابلة للمتغير.
الأمثلة على النحو التالي:
الفئة العامة tremptest {private void test1 (a) {} public static void main (string [] args) {temptest t = new treptest () ؛ a = جديد a () ؛ T.Test1 (a) ؛ // المعلمة A التي تم تمريرها هنا هي تمريرها بالرجوع}} الفئة A {Public int Age = 0 ؛ }3: خصائص مهمة للمرجعية
ما تم تمريره هو إشارة إلى القيمة ، مما يعني أنه قبل وبعد النقل إلى نفس المرجع (أي مساحة الذاكرة نفسها).
الأمثلة على النحو التالي:
الفئة العامة إغراء {private void test1 (a a) {a.age = 20 ؛ Age = "+A.Age in System.out.println (" test1 method = "+aage) ؛} الفراغ الثابت العام الرئيسي (سلسلة [] args) {tremptest t = new tremptest () ؛ a a = new a () ؛ A.AGE = 10 ؛ }} class a {public int age = 0 ؛ }نتائج التشغيل كما يلي:
العمر = 20 في طريقة Test1 ، العمر = 20 في الطريقة الرئيسية
4: فهم عملية المرور حسب المرجع - مخطط تخصيص الذاكرة
لفهم عملية المرور بشكل صحيح بالرجوع ، يجب أن تتعلم فهم عملية تخصيص الذاكرة ، ويمكن أن يساعدنا مخطط تخصيص الذاكرة في فهم هذه العملية.
استخدم المثال أعلاه لتحليل:
(1): بدء تشغيل ، تشغيل السطر 8 ، إنشاء مثيل من A ، ومخطط تخصيص الذاكرة هو كما يلي:
(2): تشغيل السطر 9 ، قم بتعديل قيمة العمر في المثال أ. مخطط تخصيص الذاكرة بعد الجري كما يلي:
(3): تشغيل السطر 10 ، وهو تمرير عنوان مساحة الذاكرة المشار إليه بواسطة المتغير A في الطريقة الرئيسية للمتغير A في طريقة Test1 وفقًا للمرجع. يرجى ملاحظة: هذان المتغيران مختلفان تمامًا ، لا تنخدع بنفس الاسم.
تخصيص الذاكرة كما يلي:
نظرًا لأنه يتم تمريره بالرجوع إليه ، فهو يتم تمرير عنوان مساحة الذاكرة ، ويكون مخطط الذاكرة الجديد المتكون بعد اكتمال النقل كما يلي:
وبعبارة أخرى: يشير كلا المتغيرين إلى نفس الفضاء.
(4): قم بتشغيل السطر 3 وقم بتعيين القيمة إلى عمر المثيل الذي أشار إليه بواسطة المتغير A في طريقة Test1. مخطط الذاكرة الجديد المتكون بعد الانتهاء هو كما يلي:
في هذا الوقت ، يكون التغيير في القيمة العمرية للمثال A ناتجًا عن طريقة Test1
(5): تشغيل السطر 4 ، ووفقًا لمخطط الذاكرة في هذا الوقت ، عمر الإخراج = 20 في طريقة Test1
(6): تشغيل السطر 11 ، ووفقًا لمخطط الذاكرة في هذا الوقت ، عمر الإخراج = 20 في الطريقة الرئيسية
5: تغييرات على الأمثلة أعلاه
بعد فهم المثال أعلاه ، قد يسأل بعض الأشخاص ، هل يمكن للقيم التي تم مرورها بالرجوع إليها لا تؤثر على بعضها البعض؟ ما هو التعديل في طريقة Test1 التي لا تؤثر على الطريقة الرئيسية؟
الطريقة هي مجرد استخدام مثيل جديد في طريقة Test1. التغيير إلى المثال التالي ، حيث تتم إضافة السلوك الثالث حديثًا:
الفئة العامة tertest {private void test1 (a) {a = new a () ؛ // خط جديد a.age = 20 ؛ System.out.println ("Test1 method Age ="+A.Age) ؛ } public static void main (string [] args) {temptest t = new tremptest () ؛ a = جديد a () ؛ A.Age = 10 ؛ T.Test1 (a) ؛ System.out.println ("Main Method Age ="+A.Age) ؛ }} class a {public int age = 0 ؛ }النتيجة الجارية هي:
العمر = 20 في Test1 طريقة العمر = 10 في الطريقة الرئيسية
لماذا تختلف نتيجة هذا التشغيل عن المثال السابق؟ من الأفضل استخدام مخطط الذاكرة لفهمه.
6: افهم بالرجوع مرة أخرى
(1): بدء تشغيل ، تشغيل السطر 9 ، إنشاء مثيل من A ، ومخطط تخصيص الذاكرة هو كما يلي:
(2): خط التشغيل 10 هو تعديل قيمة العمر في المثال أ. مخطط تخصيص الذاكرة بعد الجري كما يلي:
(3): تشغيل السطر 11 هو تمرير عنوان مساحة الذاكرة المشار إليه بواسطة المتغير A في الطريقة الرئيسية إلى المتغير A في طريقة Test1 وفقًا للمرجع. يرجى ملاحظة: هذان المتغيران مختلفان تمامًا ، لا تنخدع بنفس الاسم.
تخصيص الذاكرة كما يلي:
نظرًا لأنه يتم تمريره بالرجوع إليه ، فهو يتم تمرير عنوان مساحة الذاكرة ، ويكون مخطط الذاكرة الجديد المتكون بعد اكتمال النقل كما يلي:
وبعبارة أخرى: يشير كلا المتغيرين إلى نفس الفضاء.
(4): تشغيل السطر 3 وقم بتجديد مثيل جديد لـ A للمتغير A في طريقة Test1. مخطط الذاكرة الجديد المتكون بعد الانتهاء هو كما يلي:
(5): قم بتشغيل السطر 4 لتعيين القيمة إلى عمر المثيل الجديد الذي أشار إليه بواسطة المتغير A في طريقة Test1. مخطط الذاكرة الجديد المتكون بعد الانتهاء هو كما يلي:
ملاحظة: في هذا الوقت ، يتم تغيير عمر المتغير A في طريقة Test1 ، في حين أن الطريقة الرئيسية لا تتغير.
(6): تشغيل السطر 5 ، ووفقًا لمخطط الذاكرة في هذا الوقت ، عمر الإخراج = 20 في طريقة Test1
(7): تشغيل السطر 12 ، ووفقًا لمخطط الذاكرة في هذا الوقت ، عمر الإخراج = 10 في الطريقة الرئيسية وفقًا لمخطط ذاكرة الإخراج = 10
7: شرح
(1): "في Java ، يتم تمرير تمرير المعلمة بالقيمة": تمرير القيمة هو نسخة من القيمة التي تم تمريرها. تمرير بالمرجع في الواقع يمر قيمة العنوان المرجعي ، لذلك يسمى مجتمعة تمرير حسب القيمة.
(2): في Java ، يتم تمرير الأنواع والسلاسل الأساسية فقط وفقًا لطريقة التعريف التالية حسب القيمة ، ويتم تمرير الآخرين بالرجوع إليه. إنه لتحديد السلاسل مباشرة باستخدام عروض أسعار مزدوجة: String str = "Java Private School" ؛
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.