تعلم لغة الجافا – الدرس السادس الدوال Functions

في Java ، يجب أن تكون جميع تعريفات الوظائف داخل الكلاس. نسمي أيضًا طرق الوظائف. دعونا نلقي نظرة على مثال

public class Main {
    public static void foo() {
// افعل شيئًا هنا
    }
}

foo هي طريقة حددناها في الصف الرئيسي. لاحظ بعض الأشياء عن foo.

static يعني أن هذه الطريقة تنتمي إلى الكلاس الرئيسية وليس إلى مثيل معين من Main. مما يعني أنه يمكننا استدعاء الطريقة من الكلاس مختلفة مثل Main.foo ()

void يعني أن هذه الطريقة لا تُرجع قيمة. يمكن للطرق إرجاع قيمة واحدة في Java ويجب تعريفها في تعريف الطريقة. ومع ذلك ، يمكنك استخدام return بنفسه للخروج من الطريقة.

لا تحصل هذه الطريقة على أي وسيطات ، ولكن بالطبع يمكن لجافا الحصول على الحجج كما سنرى المزيد.

Arguments

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

تعني القيمة أنه يتم نسخ الوسائط عند تشغيل الطريقة. لنلقي نظرة على مثال.

public void bar(int num1, int num2) {
    ...
}

هنا مكان آخر في الرمز ، حيث يتم استدعاء الشريط

int a = 3;
int b = 5;
bar(a, b);

يمكنك أن تتصور في رأسك أنه عند تشغيل bar(a, b) ، يكون الأمر كما لو كان في بداية الشريط يتم كتابة الخطين التاليين:

int num1 = a;
int num2 = b;

وعندها فقط يتم تشغيل بقية الطريقة.

هذا يعني أنه يتم نسخ قيمة إلى num1 وقيمة b يتم نسخها إلى num2. لن يؤثر تغيير قيم num1 و num2 على a و b .

إذا كانت الحجج كائنات ، فإن القواعد تبقى كما هي ، لكنها تعمل بشكل مختلف قليلاً. هنا مثال:

public void bar2(Student s1, Student s2) {
    ...
}

وإليك كيفية استخدامه

Student joe = new Student("joe");
Student jack = new Student("jack");
bar2(joe, jack);

مرة أخرى يمكننا أن نتصور نفس الخطين في بداية bar2

Student s1 = joe;
Student s2 = jack;

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

s1.setName("Chuck"); // اسم جو هو الآن تشاك كذلك
s1 = new Student("Norris"); // s1 هو طالب جديد ، يختلف عن جو باسم نوريس
// s1 == joe   لم يعد صحيحًا

طرق غير ثابتة

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

يمكن للطرق غير الثابتة الوصول إلى حقل الكائن وتغييره.

public class Student {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

يتطلب استدعاء الأساليب كائنًا من النوع Student.

Student s = new Student();
s.setName("Danielle");
String name = s.getName();

Student.setName("Bob"); // لن يعمل!
Student.getName(); // لن يعمل!

ملخص

يجب أن تكون كل طريقة Java ضمن الكلاس
تنتمي الأساليب الثابتة إلى الكلاس بينما تنتمي الأساليب غير الثابتة إلى الكائنات
يتم تمرير جميع معلمات الدوال حسب القيمة ، ويتم نسخ المحتوى البدائي ، في حين لا يتم نسخ الكائنات وقد يقول البعض “مرت حسب المرجع”

تمرين

اكتب طريقة printFullName للطالب الذي يطبع الاسم الكامل للطالب.

class Student {
    private String firstName;
    private String lastName;
    public Student(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
// رمزك هنا
}

public class Main {
    public static void main(String[] args) {
        Student[] students = new Student[] {
            new Student("Morgan", "Freeman"),
            new Student("Brad", "Pitt"),
            new Student("Kevin", "Spacey"),
        };
        for (Student s : students) {
            s.printFullName();
        }
    }
}

الحل

class Student {
    private String firstName;
    private String lastName;
    public Student(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    public void printFullName() {
        System.out.println (this.firstName+" "+this.lastName);
    }
}

public class Main {
    public static void main(String[] args) {
        Student[] students = new Student[] {
            new Student("Morgan", "Freeman"),
            new Student("Brad", "Pitt"),
            new Student("Kevin", "Spacey"),
        };
        for (Student s : students) {
            s.printFullName();
        }
    }
}

سنحصل على النتيجة التالية عند التشغيل

Morgan Freeman
Brad Pitt
Kevin Spacey

الدرس السابع






Leave a Reply