JavaRush /مدونة جافا /Random-AR /تمرير المعلمات في جافا
vincent_vega
مستوى
Gainesville

تمرير المعلمات في جافا

نشرت في المجموعة
المتغير في Java عبارة عن حاوية تحتوي على قيمة. إذن ماذا يعني "تمرير" متغير؟ وما هو الفرق بين أنواع البيانات البدائية والمرجعية.
تمرير المعلمات في جافا - 1
سنصل إلى ذلك لاحقا. لنبدأ بمهمة بسيطة أولاً. ماذا يفعل هذا الكود:
int х = 3;
int у = х;
في السطر 1، يتم إنشاء متغير x من النوع int وتعيين القيمة 3. وفي السطر 2، يتم إنشاء متغير y من النوع int وتعيين قيمة المتغير x . في المستقبل، المتغير x لن يؤثر على y بأي شكل من الأشكال . تنسخ Java قيمة x (3) وتضع تلك النسخة في y . هذا هو تمرير المعلمة حسب القيمة. لا تكتب متغيرًا إلى آخر. يتم نسخ القيمة وتعيينها لمتغير جديد. التعبير ذ = س؛ لا يعني "اكتب x إلى y ". يعني "انسخ القيمة داخل x واكتب تلك النسخة إلى y ." إذا قمت لاحقًا بتغيير y :
у = 34;
هل سيؤثر هذا على x ؟ بالطبع لا. x لا يزال يحمل القيمة 3. إذا قمت بتغيير x لاحقًا :
х = 90;
كيف سيؤثر هذا على ذ ؟ مستحيل. لا ترتبط بأي شكل من الأشكال بعد إجراء التعيين (نسخ القيمة). ماذا عن أنواع المراجع؟ كيف يعملون؟ ليس بهذه الصعوبة، في الواقع القاعدة هي نفسها. الروابط تفعل نفس الشيء - تحصل على نسخة من الرابط. فإذا قلت:
Cat A = new Cat ();
Cat B = A;
يتم نسخ الرابط "أ" إلى الرابط " ب". لا ينطبق هذا على الكائن - لا يزال لديك كائن واحد فقط. ولكن الآن لديك مرجعين مختلفين يتحكمان في نفس كائن Cat . الآن دعونا نلقي نظرة على تمرير المعلمات إلى الأساليب. تقوم Java بتمرير المعلمات حسب القيمة. دائماً. وهذا يعني "نسخ القيمة وتمرير النسخة." بالنسبة للأنواع البدائية، يكون الأمر سهلاً:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
تبدو طريقة doStuff كما يلي:
void doStuff (int у) {

   / / Действия с 'y'
}
يتم تمرير نسخة من قيمة x ، أي 5، إلى طريقة doStuff() . لدى طريقة doStuff() متغير خاص بها يسمى y . المتغير y هو متغير جديد ومختلف. مع نسخة مما كان في x وقت تمريره إلى الطريقة. من الآن فصاعدا، ليس لـ y و x أي تأثير على بعضهما البعض. عندما تقوم بتغيير y ، فإنك لا تؤثر على x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
والعكس صحيح - إذا قمت بتغيير x فلن تتغير y . الشيء الوحيد الذي فعله x في هذه الحالة هو نسخ قيمته وتمريره إلى طريقة doStuff() . كيف يعمل "التمرير حسب القيمة" مع المراجع؟ يقول الكثير من الناس أن "Java تمرر الأنواع البدائية حسب القيمة والكائنات حسب المرجع." هذا ليس ما يقولون. تقوم Java بتمرير كل شيء حسب القيمة. مع البدائيين، تحصل على نسخة من المحتوى. ومن خلال الروابط، يمكنك أيضًا الحصول على نسخة من المحتوى. ولكن ما هو محتوى الرابط؟ جهاز التحكم. مرافق لإدارة / الوصول إلى المنشأة. عندما تقوم بتمرير مرجع إلى كائن إلى أسلوب ما، فإنك تقوم بتمرير نسخة من المرجع. استنساخ التحكم عن بعد. لا يزال الكائن موجودًا في الكومة التي تم إنشاؤها فيها، في انتظار أن يستخدم شخص ما جهاز التحكم عن بعد. لا تهتم المنشأة بعدد أجهزة التحكم عن بعد "المبرمجة" للتحكم فيها. الأشخاص الوحيدون الذين يهتمون بهذا الأمر هم جامع القمامة وأنت المبرمج. لذلك عندما تقول:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
لا يوجد سوى كائن قطة واحد . ولكن الآن يمكن لجهازي تحكم عن بعد (روابط) الوصول إلى نفس كائن Cat . لذا الآن فإن كل ما يفعله B بكائن Cat سيؤثر على Cat التي يشير إليها A ، لكنه لن يؤثر على محتويات A ! يمكنك تغيير Cat باستخدام الرابط الجديد B (منسوخ مباشرةً من A )، لكن لا يمكنك تغيير A. ماذا بحق الجحيم يعني هذا؟ يمكنك تغيير الكائن الذي يشير إليه A ، ولكن لا يمكنك تغيير مرجع A - قم بإعادة توجيهه إلى كائن آخر أو null . لذا، إذا قمت بتغيير مرجع B (ليس كائن Cat الفعلي الذي يشير إليه B ، ولكن قيمة المرجع نفسه) فلن تغير قيمة A. والعكس صحيح. لذا:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
إنه يعني ببساطة أن B يشير إلى كائن آخر. أ لا يزال سعيدا. لذا كرر بعدي: تقوم Java بتمرير كل شيء حسب القيمة. (حسنًا، مرة أخرى... مع الشعور.) تمر Java بكل شيء حسب القيمة. بالنسبة للأنواع البدائية، تقوم بتمرير نسخة من القيمة الحالية، وبالنسبة لمراجع الكائنات، تقوم بتمرير نسخة من المرجع (جهاز التحكم عن بعد). أنت لا تمرر الكائن أبدًا. يتم تخزين كافة الكائنات في الكومة. دائماً. الآن قم بإعداد فنجان كبير من القهوة واكتب بعض التعليمات البرمجية! المقالة الأصلية .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION