اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر (معدل)

بالطبع يحفظ الكائن من نمط صف ما في الذاكرة على شكل reference  (مرجع). أي يقوم بحجز مكان في الذاكرة يناسب خصائص هذا الكائن، ومن خلال هذا المرجع يمكن الوصول إلى الوظائف. وبالتالي عند تمرير الكائن ضمن وظيفة يقوم بعمل نسخة من مرجع هذا الكائن وتمريرها للوظيفة -ربما يختلف هذا الأمر من لغة لأخرى-. فمثلا في لغة جافا يقوم بتمرير الصف كمرجع، وبالتالي إذا كان في الصف وظائف تستطيع التعديل على الكائن (باستخدام ما يسمى بال setter methods) فبإمكاننا التعديل على هذا الكائن.

تم التعديل في بواسطة معاذ قره محمد
  • 0
نشر

في لغة جافا يتم التمرير دائماً بالقيمة، أي أن نسخة من البيانات هي التي يتم تمريرها، لكن ما الذي يتم تمريره هو الذي يجعل فكرة التعديل ممكنة.

حيث أنه في جافا عند التعامل مع متحول يحتوي على كائن فإننا فعلياً نتعامل مع ما يسمى object-handler و هو مثل مرجع للغرض، أي أن المتحول بحد ذاته يحمل قيمة مرجع للغرض، و بالتالي عند تمريره بالقيمة سنمرر قيمته و التي هي بحد ذاتها مرجع للغرض.

و هذا ما يسمح لنا بالتعديل على الغرض في تابع ما، و لكن لا يمكننا إعادة إسناد المتحول مثل التمرير العادي بالمرجع، حيث أن إعادة الإسناد سوف تعطي قيمة أخرى للمرجع و بالتالي سنصبح نتعامل مع كائن آخر.

باختصار يمكنك تغيير القيمة باستعمال توابع الكائن، و لكن لا يمكنك تغيير ما يؤشر إليه الكائن الذي قمت بتمريره، أي أنه سيبقى يحوي على نفس الكائن و لكن يمكن تغيير خصائصه.

  • 0
نشر
بتاريخ 6 دقائق مضت قال hanan fahad11:

ليش نحط اسم الكلاس بالداله ليش مانحط اسم الكائن لوحدة 

public static void fun(className ob){

className ob ليش مانقول ob بدون لاحظت كثير يتم استخدامها شالغرض منها 

نضع اسم الكائن ضمن الدالة لكي يعرف المترجم طول البيانات وحجمها في الذاكرة. يعني مثلا عندما نقول للمترجم لدينا الغرض من النمط (Person) فهو يضع بحسبانه أن له صفات معينة مثل الاسم والوظيفة وغيرها (بفرض أننا قمنا بتعريف صف Person). أي أنّ وضع اسم الصف يكون ليعرف المترجم ما هو نمط الغرض الذي يمرّر له وصفاته. وبشكل عام إن كنت تكتب بلغة الجافا فأنت لا تستطيع تعريف طريقة تأخذ غرض من صف بدون اسم الصف

void function(obj){...} // خطأ
void function(className obj){...} // صواب

لا بد من أن تضع نوع هذا الغرض. ويجب أن تنتبه أنك عندما تمرر غرض من صف ضمن طريقة ما تتم عملية قصر ضمني، مثلا لتكن الطريقة:

void function(Person p){..}

والآن إذا حاولت تمرير كائن من غير نمط ال Person لهذه الطريقة، سيشير لك لخطأ في الكود أنك تحاول تمرير كائن لا يتوافق مع النمط الذي تتطلبه الوظيفة:

Car c = new Car();
function(c); // هنا سيشير لك لخطأ

وإذا قمت بتنفيذ الكود سيخرج لك الخطأ عدم التوافق بين المعطيات.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...