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

الفرق بين الـ static methods and non static methods

بدأه vector_ever في 10 يونيو 2011 · 6 رد · 2,771 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

سؤالي ليس عن المتحولات الستايكية انما عن المناهج الستاتيكية

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

public void PrintIndex() {
................
..............
................
}

 ومن ثم هناك

public static void PrintIndex() {
................
..............
................
}

سؤال آخر بت مؤخرا أرى الكثير من المناهج على الشكل التالي

public void anyMethod() {
................
..............
................
return;
}

سؤالي هنا كيف انه void ويحتوي الكلمة المرجعية return مع انه لم يتم return لمن فقط كلمة return

فهل من جواب يا اخوان يبدد الحيرة لدي

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#2

الداله الاستاتيك داله خاصه في الكلاس بينما الدوال العاديه يتم استدعاءها من object

خذ مثال على الداله الاستاتيك ، دوال البكاج Math

Math.abs(y);

لاحظ انك بتستخدم اسم الكلاس في الاستدعاء بس لو عندك اوبجكت ممكن كمان تستخدم اسم الاوبجكت بدل اسم الكلاس

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

بالنسبة للreutrn هي بتعمل بس ارجاع تحكم للداله اللي قامت بالاستدعاء وما ترجعش اي قيمه

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#3
mental-driller كتب:

الداله الاستاتيك داله خاصه في الكلاس بينما الدوال العاديه يتم استدعاءها من object

خذ مثال على الداله الاستاتيك ، دوال البكاج Math

Math.abs(y);

لاحظ انك بتستخدم اسم الكلاس في الاستدعاء بس لو عندك اوبجكت ممكن كمان تستخدم اسم الاوبجكت بدل اسم الكلاس

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

بالنسبة للreutrn هي بتعمل بس ارجاع تحكم للداله اللي قامت بالاستدعاء وما ترجعش اي قيمه

تحياتي اخي وشكرا لردك

لكن للامانة لم افهم مقصدك بالنسبة للسؤالين

انه الجواب الاول حول الدوال الغير ستاتيك انه يتم استدعائها من قبل اوبجكت

طيب اخي انا كنت استدعي الدوال التساتيك من كنحولات عادية وليست اوبجكت

ويلاحظ أنه بالنسبة للدوال الستاتيك عند حذف كلمة ستاتيك احصل على خطا والدوال الغير ستاتيك عند اضافة كلمة ستاتيك احصل ايضا على خطا فلماذا

بالنسبة للسؤال الثاني انه بالنسبة للـ reutrn هي بتعمل بس ارجاع تحكم للداله اللي قامت بالاستدعاء وما ترجعش اي قيمه

طيب تحكم بماذا ما هو التحكم هذا وبماذا يفيد وماذا ساخسر لو حذفت كلمة return

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#4

بتحصل على خطأ في الاستاتيك لانك بتحاول الدخول على instance variable و ديه المتغيرات ممكن تستدعيها من داخل اوبجكت بس لانها تختلف من اوبجكت لاوبجكت

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

اسأل نفسك لماذا الداله main يجب ان تكون ستاتيك؟ جواب بسيط لانه يجب ان تكون لديك القدره على استدعاء الداله قبل تكوين اي اوبجكت في البرنامج

الكلاس لودر class loader الخاص بالJVM يقوم بتوليد المتغيرات الاستاتيك والدوال الاستاتيك عند بدء تشغيل الJVm وقبل تكوين اي اوبجكت لانك لاتحتاج اي اوبجكت لاستدعاء الدوال الاستاتيك

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

تشبه الى حد ما كلمة RET في لغة اسمبلي التي تقوم بارجاع التحكم

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

if(x == 0)
return;
else
{
if(y == 1)
return;
else
y += x;
}

هذا كود ليس له اي معنى دلالي ولكنه مثال بسيط

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

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#5
mental-driller كتب:

بتحصل على خطأ في الاستاتيك لانك بتحاول الدخول على instance variable و ديه المتغيرات ممكن تستدعيها من داخل اوبجكت بس لانها تختلف من اوبجكت لاوبجكت

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

اسأل نفسك لماذا الداله main يجب ان تكون ستاتيك؟ جواب بسيط لانه يجب ان تكون لديك القدره على استدعاء الداله قبل تكوين اي اوبجكت في البرنامج

الكلاس لودر class loader الخاص بالJVM يقوم بتوليد المتغيرات الاستاتيك والدوال الاستاتيك عند بدء تشغيل الJVm وقبل تكوين اي اوبجكت لانك لاتحتاج اي اوبجكت لاستدعاء الدوال الاستاتيك

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

تشبه الى حد ما كلمة RET في لغة اسمبلي التي تقوم بارجاع التحكم

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

if(x == 0)
return;
else
{
if(y == 1)
return;
else
y += x;
}

هذا كود ليس له اي معنى دلالي ولكنه مثال بسيط

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

شكرا مرة اخرى لردك أخي وتقريبا السؤال الاول فهمت قصدك

بس يبقى السؤال الثاني انه لحد الآن لم افهم معنى كلمة تحكم

قصدي تحكم بماذا ولماذا وهل اذا حذفت كلمة return اخسر شيء انت قلت انها تعيد التنفيذ الى الداله التي قامت باستدعاء الداله

وماذا اشتفيد من انها اعادت التحكم وكيف يعني التحكم عاد مرة أخرى للدالة

وشكرا

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#6

الامر له علاقة باسلوب استدعاء الدوال :

لنقل ان برنامجك يحمل في الذاكره ram عندما يبدأ برنامجك بالتنفيذ يبدأ من عنوان الداله main مثلا

عندما تقوم باستدعاء داله اخرى ، فان اسم الداله يشير الى موقع بدايه كود تنفيذ الداله في الذاكره لذا عندما تقول

public static void main (String[] args)}
.
.
.
.
.
x.func();

يقفز البرنامج الى عنوان الداله func() في الذاكره ويستمر بالتنفيذ ، الطريقه الوحيده التي يستطيع بها البرنامج الرجوع الي الداله التي استدعت الداله func هي عن طريق الامر return الذي يرجع التحكم الى الداله

وهو يترجم الى RET بلغة اسمبلي التي سوف تحمل مؤشر الاوامر بعنوان الداله المستدعيه المحفوظ في stack

طبعا يجب ان لا تكون هذه مشكله في الدوال التي ترجع void حيث ينتهي التنفيذ حال الوصول الى نهاية الداله ولكن عندما تريد ان تتحكم باسلوب الارجاع تصبح return مفيده ، بالبطع اذا لم تقم بكتابتها سوف تنفذ

باسلوب implicit ولكن بالنسبه للدوال التي ترجع قيم يجب وجود امر return مضاف اليه القيمه المرجعه ، حيث انه يتم خزن القيمه المرجعه في سجل خاص في المعالج حسب نوع المعالج

لمزيد من المعلومات اقرأ عن function activation record حيث ان الامر له علاقه اكثر باسلوب تنفيذ الدوال اكثر منه كلغه برمجه

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

2

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#7

رد أكثر من رائع شكرا اخي الكريم بارك الله بك

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


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