الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

المناداة عن طريق القيم & المناداة عن طريق المرجع في الجافا

بدأه kousai في 18 يونيو 2008 · 0 رد · 791 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1

سلامي وتحياتي الى جميع افراد اسرة المنتدى واخص المبتدئين مثلي بتعلم لغة الجافا

اليوم بدنا نحكي عن موضوع مهم نوعا ما ويعد من اساسيات الجافا وهم المناداة (الاستدعاء) عم طريق القيم والاستدعاء عن طريق المرجع

قبل ما ابدأ الشرح لابد من تبسيط وتعريب مصطلحات سأذكرها كتيرا في هدا الموضوع وهي التالي

argument ويعني الوسيط الذي يمكننا استخدامه داخل الاسلوب على الشكل

method(argument1, argument2, .......)

Parameter : وهو المعامل ايضا يستخدم داخل الاسلوب

reference : ويسمى المرجع اي انه لابد ان نرجع الى اساس ونوع الوسيط او القيمة المراد استدعائها

الان ندخل في لب الموضوع

جميع الوسطاء في الجافا يمكن استدعائها على طريق القيام بنسخ قيمتها سواء اكانت هذه الوسطاء هي من نوع سابق التعريف مثل (String , int , double, char) او كانت مرجعة لنوع اخر اي reference

ان ألية مناداة قيمة الوسيط مبنية على اساسان وهما كما ذكرنا call by value and call by reference

لنبدأ اولا بالمناداة عن طريقة القيم ....حتى نفهم ماتحمله call by value من معنى يجب ان نرجع الى اسلوب تجزئة البرنامج

فهده الطريقة هي عبارة عن اداة او وسيلة لنقل المجادلات من برنامج نداء الى برنامج جزئي وفيها يمد البرنامج الجزئي بالقيم الرمزية للمجادلة عم طريق العودة مرة اخرى الى البرنامج المرجع

لنتعمق اكثر في هده الألية فعندما نعطي اي وسيط قيمة تنسخ هده القيمة على عنوان مادي (Memory address) ضمن مكدس الاسلوب (Stack of the Method)

على كل الاحوال سواء كان هدا الوسيط عبارة عن قيمة ثابتة من اي نوع معرف او من نوع المرجع فانه هنا ترجع القيمة المنسوخة على شكل قيمة ثابتة (parameter) والقيمة تكون قابلة للتغيير فقط ضمن الأسلوب

لابد من الاشارة هنا الى امكانية استخدام المتغير المحلي او ما يعرف ب Local Variable وهدا يعني ان المتغير هنا لايمكن استعماله خارج الجزء الذي قمنا بتعريفه فيه

اي ان صلاحية المتغير تنتهي مباشرة بعد الانتهاء من مناداة الاسلوب مع الوسيط المطلوب

الان نتطرق الى موضوع الاستدعاء عن طريق المرجع call by reference

لنفسراولا الية مناداة المرجع بشكل عام

يتم التعامل بين المتغير والمرجع على اساس ان احدهما هو اسم اخر للثاني وبذلك تتغير قيمة المتغير فورا بعد تغيير قيمة المرجع

هدا ينطبق بشكل عام ولكنه كلام غير صحيح في لغتنا الجافا

حيت انه لاستدعاء عنصر اقصد به اوبجكت يستخدم مرجع من نفس نوع العنصر كوسيط للأسلوب وهكذا يتم نسخ القيمة تماما كما في call by value

بعد هذا الشرح الممل دعونا نطبق ما قمنا بذكره عمليا ولهدا يجب علينا تبيين ماسبق شرحه ضمن برنامج جافا صغير

في موضوعي السابق تطرقت للحديث عن تعيين احداثيات نقطة معينة وهنا يستحسن الرجوع الى البرنامج هناك تحت الرابط التالي

/index.php?showtopic=162830

او لتوفير الوقت اعيد كتابة البرنامج مرة اخرى

public class Punkt {
public double x;
public double y;


public void setX(double x){
  this.x = x;
}

public double getX(){
  return x;
}

public void setY(double y){
  this.y = y;
}

public double getY(){
  return y;
}


public Punkt(double x, double y){
  this.x=x;
  this.y=y;
}
public  void anzeige(){
  System.out.println("(" + getX() + "," + getY() + ")");
}
}

و الان نكتب كلاس جديد وبداخله ثلاثة اساليب دات وسطاء مختلفة كما يلي

public class MethodParameter {
 public static void method1(int x, int[] y){
  x= 0;
  y[1] = 0;
 }
 public static void method2(Punkt x, Punkt[] y){
  x.setX(0);
  x.setY(0);
  y[1].setX(0);
  y[1].setY(0);
 }
 public static void method3(Punkt x){
  x.setX(0);
  x.setY(0);
 }
 public static void main(String[] args){
  int i = 1;
  int[] iarray = {1,2,3};
  Punkt p = new Punkt(4.0, 3.0);
  Punkt[] parray = {new Punkt(1.0, 1.0), new Punkt(2.0, 2.0)};
 System.out.println("int_Variable befor the call of " + "method1():  " + i );
 System.out.println("Array_Variable befor the call of " + "method1():  " + i );
 for (int r= 0; r<iarray.length; r++){
  System.out.println(iarray[r]);
 }
 System.out.println("");
 method1(i, iarray);
 System.out.println("int_Variable after the call of " + "method1():	" + i);

 System.out.println("Array-Variable after the call of" + "method1():   " );
 for (int j =0; j<iarray.length; j++){
  System.out.println(iarray[j]);
 }
 System.out.println("reference of type Punkt " + "befor the call of method2():"  );
 p.anzeige();
 System.out.println("reference of type Punkt-Array " + "befor the call of method2():"  );
 for (int j = 0; j<parray.length;j++){
  parray[j].anzeige();
 }
 method2(p,parray);
 System.out.println("reference of type Punkt " + "after the call of method2():"  );
 p.anzeige();
 System.out.println("reference of type Punkt-Array " + "after the call of method2():"  );
 for (int j = 0; j<parray.length;j++){
  parray[j].anzeige();
 }
 System.out.println("reference of type Punkt"+ "befor the call of method3():  ");
 p.anzeige();
 method3(p);
 System.out.println("reference of type Punkt"+ "after the call of method3():  ");
 p.anzeige();
 }


}

حتى لااطيل شرح البرنامج فهنا لابد لنا من ان ننتبه الى قيم الوسطاء قبل استدعاء الاساليب وبعد الاستدعاء

فكما نرى ان استدعاء العنصر من نوع النقطة قبل مناداة الاسلوب الثاني يرجع لنا نقطة ذات بعدين وهما 4,0 و 3,0

اما استدعاء نفس العنصر بعد مناداة الاسلوب الثاني يرجع لنا نقطة ذات بعدين مختلفين عن سابقتها 0,0 و 0,0

ان سبب الاختلاف هو بسيط جدا ويكمن داخل الاسلوب الثاني حيث اننا هناك قمنا بأعطاء النقطة بعدين جديدين لا علاقها لهما بالبعدين الاوليين

وهكذا نكون قد انتهينا من احد اساسيات البرمجة في الجافا

أخيرا وليس اخرا انا طالب سنة اولى مبتدء لا املك ماتملكوه من خبرة لذلك ارجو منكم الاشارة الى اي خلل او خطأ في الموضوع التى اكتبها واكون لكم من الشاكرين

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…