في الفصول السابقة كثيرًا ما استخدمنا System.out.println()، فما هو؟
println () هي طريقة (طريقة)، والنظام هو فئة نظام (فئة)، والخروج هو كائن إخراج قياسي (كائن). استخدام هذه الجملة هو استدعاء الأسلوب println() في كائن الإخراج القياسي في فئة النظام System.out.
طريقة Java عبارة عن مجموعة من العبارات التي تؤدي معًا وظيفة ما.
الطريقة عبارة عن مجموعة مرتبة من الخطوات لحل نوع من المشكلة
الأساليب الموجودة في الفئات أو الكائنات
يتم إنشاء الأساليب في البرنامج والإشارة إليها في مكان آخر
بشكل عام، يتضمن تعريف الطريقة بناء الجملة التالي:
اسم طريقة نوع قيمة الإرجاع المعدل (اسم معلمة نوع المعلمة) {
...
هيئة الطريقة...
إرجاع قيمة الإرجاع؛
}
تحتوي الطريقة على رأس الطريقة ونص الطريقة. فيما يلي جميع أجزاء الطريقة:
المعدلات: المعدلات الاختيارية تخبر المترجم بكيفية استدعاء الطريقة. يحدد نوع الوصول لهذه الطريقة.
نوع قيمة الإرجاع: قد تقوم الطرق بإرجاع القيم. returnValueType هو نوع بيانات قيمة إرجاع الطريقة. تقوم بعض الطرق بتنفيذ العملية المطلوبة ولكنها لا تُرجع قيمة. في هذه الحالة، returnValueType هي الكلمة الأساسية void .
اسم الطريقة: هو الاسم الفعلي للطريقة. يشكل اسم الطريقة وقائمة المعلمات معًا توقيع الطريقة.
نوع المعلمة: المعلمة تشبه العنصر النائب. عندما يتم استدعاء الأسلوب، يتم تمرير القيم إلى المعلمات. تسمى هذه القيمة معلمة أو متغيرًا فعليًا. تشير قائمة المعلمات إلى نوع المعلمة وترتيبها وعدد معلمات الطريقة. المعلمات اختيارية ولا يمكن أن تحتوي الطرق على أي معلمات.
نص الطريقة: يحتوي نص الطريقة على عبارات محددة تحدد وظيفة الطريقة.
يحب:
publicstaticintage(intbirthday){...}
يمكن أن يكون هناك معلمات متعددة:
staticfloatinterest(floatprincipal,intyear){...}
ملحوظة: في بعض اللغات الأخرى تشير الطرق إلى الإجراءات والوظائف. تسمى الطريقة التي تُرجع قيمة إرجاع غير فارغة دالة؛ وتسمى الطريقة التي تُرجع قيمة إرجاع فارغة إجراءً.
تحتوي الطريقة أدناه على معلمتين num1 وnum2 وتقوم بإرجاع القيمة القصوى لهاتين المعلمتين.
/**إرجاع القيمة الأكبر لبيانات المتغيرين الصحيحين*/
publicstaticintmax(intnum1,intnum2){
تطفل؛
إذا (رقم 1> رقم 2) {
النتيجة=num1;
}آخر{
النتيجة=num2;
}
returnresult;
}
تدعم Java طريقتين لاستدعاء الأساليب، اعتمادًا على ما إذا كانت الطريقة تُرجع قيمة.
عندما يستدعي برنامج طريقة ما، يتم نقل التحكم في البرنامج إلى الطريقة المطلوبة. يتم إرجاع التحكم إلى البرنامج عند تنفيذ بيان الإرجاع الخاص بالأسلوب المستدعى أو عند الوصول إلى قوس إغلاق نص الطريقة.
عندما تقوم إحدى الطرق بإرجاع قيمة، يتم عادةً التعامل مع استدعاء الطريقة كقيمة. على سبيل المثال:
intlarger=max(30,40);
إذا كانت قيمة إرجاع الطريقة فارغة، فيجب أن يكون استدعاء الطريقة عبارة. على سبيل المثال، الأسلوب println يُرجع فارغًا. النداء التالي هو بيان:
System.out.println("مرحبًا بك في Java!");
يوضح المثال التالي كيفية تعريف الأسلوب وكيفية استدعائه:
publicclassTestMax{
/**الطريقة الرئيسية*/
publicstaticvoidmain(String[]args){
إنتي=5;
intj=2;
intk=max(i,j);
System.out.println("الحد الأقصى بين"+i+
"and"+j+"is"+k);
}
/**إرجاع القيمة الأكبر للمتغيرين الصحيحين*/
publicstaticintmax(intnum1,intnum2){
تطفل؛
إذا (رقم 1> رقم 2) {
النتيجة=num1;
}آخر{
النتيجة=num2;
}
returnresult;
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
الحد الأقصى بين 5 و 2 هو 5
يحتوي هذا البرنامج على الطريقة الرئيسية والطريقة القصوى. يتم استدعاء الطريقة الرئيسية بواسطة JVM وبخلاف ذلك، لا تختلف الطريقة الرئيسية عن الطرق الأخرى.
يظل رأس الطريقة الرئيسية دون تغيير، كما هو موضح في المثال، مع المعدلات العامة والثابتة، يُرجع قيمة نوع فارغة، واسم الطريقة رئيسي، ويأخذ معلمة نوع سلسلة []. تشير السلسلة [] إلى أن المعلمة عبارة عن مصفوفة سلسلة.
يشرح هذا القسم كيفية إعلان واستدعاء طريقة باطلة.
يوضح المثال التالي طريقة باسم printGrade ويستدعيها لطباعة الدرجة المحددة.
publicclassTestVoidMethod{
publicstaticvoidmain(String[]args){
printGrade(78.5);
}
publicstaticvoidprintGrade(درجة مزدوجة){
إذا (النتيجة> = 90.0) {
System.out.println('A');
}
إلسيف(النتيجة>=80.0){
System.out.println('B');
}
إلسيف(النتيجة>=70.0){
System.out.println('C');
}
إلسيف(النتيجة>=60.0){
System.out.println('D');
}
آخر{
System.out.println('F');
}
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
ج
طريقة printGrade هنا هي طريقة كتابة فارغة ولا تُرجع قيمة.
يجب أن يكون استدعاء أسلوب باطلة عبارة. لذلك، يتم استدعاؤه كبيان في السطر الثالث من الطريقة الرئيسية. تمامًا مثل أي عبارة تنتهي بفاصلة منقوطة.
عند استدعاء أسلوب ما، يجب عليك توفير المعلمات، ويجب عليك توفيرها بالترتيب المحدد في قائمة المعلمات.
على سبيل المثال، تقوم الطريقة التالية بطباعة رسالة n مرات متتالية:
publicstaticvoidnPrintln(Stringmessage,intn){
ل(inti=0;i<n;i++)
System.out.println(message);
}
يوضح المثال التالي تأثير التمرير حسب القيمة.
يقوم هذا البرنامج بإنشاء طريقة لتبادل متغيرين.
publicclassTestPassByValue{
publicstaticvoidmain(String[]args){
intnum1=1;
intnum2=2;
System.out.println("طريقة التبديل المسبق، num1is"+
num1+"andnum2is"+num2);
// استدعاء طريقة المبادلة Swap(num1,num2);
System.out.println("أسلوب التبديل اللاحق، num1is"+
num1+"andnum2is"+num2);
}
/**طريقة تبادل متغيرين*/
publicstaticvoidswap(intn1,intn2){
System.out.println("tInsidetheswapmethod");
System.out.println("ttقبل التبديلn1is"+n1
+"n2is"+n2);
// تبادل قيم n1 و n2 inttem=n1;
n1=n2;
n2=درجة الحرارة;
System.out.println("ttAfterswappingn1is"+n1
+"n2is"+n2);
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
قبل طريقة المبادلة، num1is1andnum2is2
داخل طريقة المبادلة
قبل المبادلةn1is1n2is2
بعد التبديلn1is2n2is1
طريقة ما بعد المبادلة، num1is1 وnum2is2
استدعاء طريقة المبادلة لتمرير معلمتين. ومن المثير للاهتمام أن قيم المعلمات الفعلية لا تتغير بعد استدعاء الطريقة.
تنطبق الطريقة القصوى المستخدمة أعلاه فقط على بيانات النوع int. ولكن ماذا لو كنت تريد الحصول على الحد الأقصى لقيمة نوعين من البيانات ذات الفاصلة العائمة؟
الحل هو إنشاء طريقة أخرى بنفس الاسم ولكن بمعلمات مختلفة، كما هو موضح في الكود التالي:
publicstaticdoublemax(doublenum1,doublenum2){
إذا (رقم 1> رقم 2) {
returnnum1;
}آخر{
returnnum2;
}
}
إذا قمت بتمرير معلمة int عند استدعاء الطريقة max، فسيتم استدعاء الطريقة max للمعلمة int؛
إذا تم تمرير معلمة مزدوجة، فسيتم استدعاء نص الطريقة الأقصى للنوع المزدوج، وهذا ما يسمى التحميل الزائد للطريقة؛
أي أن هناك طريقتين لفئة لهما نفس الاسم، لكن قوائم المعلمات مختلفة.
يحدد مترجم Java الطريقة التي يجب استدعاؤها بناءً على توقيع الطريقة.
يمكن أن يؤدي التحميل الزائد للطريقة إلى جعل البرنامج أكثر وضوحًا وأسهل في القراءة. يجب أن تستخدم الأساليب التي تؤدي المهام ذات الصلة الوثيقة نفس الاسم.
يجب أن تحتوي الأساليب المحملة بشكل زائد على قوائم معلمات مختلفة. لا يمكنك التحميل الزائد للطرق التي تعتمد فقط على المعدلات أو أنواع الإرجاع.
نطاق المتغير هو جزء البرنامج الذي يمكن الرجوع إلى المتغير منه.
تسمى المتغيرات المحددة ضمن الطريقة بالمتغيرات المحلية.
يبدأ نطاق المتغير المحلي من إعلانه وينتهي في نهاية الكتلة التي تحتوي عليه.
يجب الإعلان عن المتغيرات المحلية قبل استخدامها.
يغطي نطاق المعلمة للطريقة الطريقة بأكملها. المعلمة هي في الواقع متغير محلي.
المتغيرات المعلنة في جزء التهيئة من الحلقة لها نطاق طوال الحلقة.
لكن نطاق تطبيق المتغير المعلن في نص الحلقة هو من إعلانه إلى نهاية نص الحلقة. يحتوي على إعلانات متغيرة كما هو موضح أدناه:
يمكنك الإعلان عن متغير محلي بنفس الاسم عدة مرات داخل إحدى الطرق، في كتل مختلفة غير متداخلة، لكن لا يمكنك الإعلان عن متغير محلي مرتين داخل كتلة متداخلة.
في بعض الأحيان تريد تمرير الرسائل إلى برنامج أثناء تشغيله. يتم تحقيق ذلك عن طريق تمرير وسيطات سطر الأوامر إلى الدالة main().
معلمات سطر الأوامر هي المعلومات التي تلي اسم البرنامج مباشرة عند تنفيذ البرنامج.
يقوم البرنامج التالي بطباعة كافة وسيطات سطر الأوامر:
publicclassCommandLine{
publicstaticvoidmain(Stringargs[]){
for(inti=0;i<args.length;i++){
System.out.println("args ["+i+"]:"+args[i]);
}
}
}
قم بتشغيل البرنامج كما هو موضح أدناه:
javaCommandLineهذا هوcommandline200-100
نتائج التشغيل هي كما يلي:
الوسائط[0]:هذا
الوسائط[1]:هو
الحجج[2]:أ
الوسائط[3]:الأمر
الوسائط[4]:خط
الوسائط[5]:200
الوسائط[6]:-100
عند إنشاء كائن، يتم استخدام المُنشئين لتهيئة الكائن. يحمل المُنشئ نفس اسم الفئة التي ينتمي إليها، لكن المُنشئ ليس له قيمة إرجاع.
تُستخدم المُنشئات عادةً لتعيين قيم أولية لمتغيرات مثيل الفئة، أو لتنفيذ الخطوات الضرورية الأخرى لإنشاء كائن كامل.
بغض النظر عما إذا كنت قد قمت بتخصيص المُنشئ أم لا، فإن جميع الفئات لها مُنشئات لأن Java توفر مُنشئًا افتراضيًا تلقائيًا يقوم بتهيئة جميع الأعضاء إلى 0.
بمجرد تحديد المنشئ الخاص بك، يصبح المنشئ الافتراضي غير صالح.
فيما يلي مثال باستخدام أساليب البناء:
// منشئ بسيط static classMyClass{
انتكس.
// فيما يلي المنشئ MyClass(){
س=10;
}
}
يمكنك تهيئة كائن عن طريق استدعاء المنشئ مثل هذا:
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass();
MyClasst2=newMyClass();
System.out.println(t1.x+""+t2.x);
}
}
في معظم الأحيان تكون هناك حاجة إلى مُنشئ ذي معلمات.
فيما يلي مثال باستخدام أساليب البناء:
// مُنشئ بسيط classMyClass{
انتكس.
// فيما يلي المنشئ MyClass(inti){
س=أنا;
}
}
يمكنك تهيئة كائن عن طريق استدعاء المنشئ مثل هذا:
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass(10);
MyClasst2=newMyClass(20);
System.out.println(t1.x+""+t2.x);
}
}
نتائج التشغيل هي كما يلي:
1020
بدءًا من JDK 1.5، تدعم Java تمرير معلمات متغيرة من نفس النوع إلى إحدى الطرق.
يبدو إعلان المعلمات المتغيرة للطريقة كما يلي:
اسم النوع... اسم المعلمة
في تعريف الطريقة، قم بإضافة علامة الحذف (...) بعد تحديد نوع المعلمة.
يمكن تحديد معلمة متغيرة واحدة فقط في الطريقة، ويجب أن تكون المعلمة الأخيرة للطريقة. يجب الإعلان عن أي معلمات عادية قبل ذلك.
publicclassVarargsDemo{
publicstaticvoidmain(Stringargs[]){
// استدعاء طريقة المعلمة المتغيرة printMax(34,3,3,2,56.5);
printMax(newdouble[]{1,2,3});
}
publicstaticvoidprintMax(double...numbers){
إذا (numbers.length==0){
System.out.println("Noargumentpassed");
يعود؛
}
doubleresult=numbers[0];
ل(inti=1;i<numbers.length;i++)
إذا (الأرقام[i]>النتيجة){
النتيجة=الأرقام[i];
}
System.out.println("Themaxvalueis"+result);
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
القيمة القصوى هي 56.5
القيمة القصوى هي 3.0
تسمح Java بتعريف مثل هذه الطريقة، والتي يتم استدعاؤها قبل تدمير الكائن (إعادة تدويره) بواسطة أداة تجميع البيانات المهملة. وتسمى هذه الطريقة Finalize()، والتي يتم استخدامها لمسح الكائن المعاد تدويره.
على سبيل المثال، يمكنك استخدام الدالة Finalize() للتأكد من إغلاق الملف الذي تم فتحه بواسطة كائن.
في طريقة Finalize()، يجب عليك تحديد العمليات التي سيتم تنفيذها عند تدمير الكائن.
التنسيق العام للصيغة النهائية () هو:
محمي الفراغ النهائي ()
{
// رمز المحطة هنا}
الكلمة الأساسية المحمية هي مؤهل يضمن عدم استدعاء طريقة Finalize () بواسطة التعليمات البرمجية خارج الفصل.
بالطبع، يمكن إكمال إعادة تدوير ذاكرة Java تلقائيًا بواسطة JVM. إذا كنت تستخدمه يدويًا، فيمكنك استخدام الطريقة المذكورة أعلاه.
publicclassFinalizationDemo{
publicstaticvoidmain(String[]args){
Cakec1=newCake(1);
Cakec2=newCake(2);
Cakec3=newCake(3);
c2=c3=null;
System.gc();//استدعاء أداة تجميع البيانات المهملة في Java}
}
classCakeextendsObject{
publicintid;
publicCake(intid){
this.id=id;
System.out.println("CakeObject"+id+"تم إنشاؤه");
}
protectedvoidfinalize()throwsjava.lang.Throwable{
super.finalize();
System.out.println("CakeObject"+id+"isdispose");
}
}
بتشغيل الكود أعلاه، تكون نتائج الإخراج كما يلي:
C:1>javaFinalizationDemo
تم إنشاء CakeObject1
تم إنشاء CakeObject2
CakeObject3iscreated
CakeObject3isdisised
CakeObject2isdisised