الدرس 15: معلمات الدالة، والوسائط، والتمرير بالقيمة
غالبًا ما تحتاج الدوال إلى بيانات مدخلة لأداء مهامها. يتم تمرير هذه البيانات عبر المعلمات والوسائط.
1. المعلمات (Parameters) مقابل الوسائط (Arguments)
- المعلمات (Parameters): هي المتغيرات المحددة في توقيع الدالة (التعريف) التي تستقبل البيانات.
- الوسائط (Arguments): هي القيم الفعلية التي يتم تمريرها إلى الدالة عند استدعائها.
java public class Greeting { // name و hour هما PARAMETERS public void greet(String name, int hour) { String timeOfDay = (hour < 12) ? "Morning" : "Evening"; System.out.println("Good " + timeOfDay + ", " + name); } }
// استدعاء الدالة Greeting g = new Greeting(); // "Sarah" و 9 هما ARGUMENTS g.greet("Sarah", 9);
2. لغة Java دائماً تمرر بالقيمة (Pass-by-Value)
عند تمرير وسيط إلى دالة، تستخدم Java دائماً التمرير بالقيمة. هذا يعني أنه يتم تمرير نسخة من القيمة.
الأنواع الأولية (تمرير بالقيمة)
إذا قمت بتمرير نوع أولي (int, double ، إلخ)، تتلقى الدالة نسخة. التغييرات داخل الدالة لا تؤثر على المتغير الأصلي.
java public void changePrimitive(int number) { number = 99; // يغير نسخة المتغير فقط }
int x = 10; changePrimitive(x); // x لا تزال 10 خارج الدالة
الكائنات (تمرير القيمة للمرجع)
عند تمرير كائن، لا تزال Java تمرر نسخة من القيمة — لكن تلك القيمة هي عنوان الذاكرة (المرجع) للكائن.
- يمكنك تعديل محتويات الكائن: لأن كلاً من المتغير الأصلي والمعلمة يشيران إلى نفس الكائن في الذاكرة.
- لا يمكنك تغيير ما يشير إليه المتغير الأصلي: إذا قمت بتعيين كائن جديد تماماً للمعلمة داخل الدالة، فإن المتغير الأصلي في الخارج يظل دون تغيير.
java // نفترض أن Person فئة بها خاصية name public void changeObject(Person p) { p.setName("Changed Name"); // صحيح: يعدل حالة الكائن
// p = new Person("New Reference"); // يفشل في تغيير المرجع الأصلي
}