JavaRush /مدونة جافا /Random-AR /الأساليب ومعاييرها والتفاعل والتحميل الزائد

الأساليب ومعاييرها والتفاعل والتحميل الزائد

نشرت في المجموعة
مرحبا مجددا! في المحاضرة الأخيرة، تعرفنا على الفصول والمنشئين، وتعلمنا كيفية إنشاء فصولنا الخاصة. الأساليب ومعاييرها والتفاعل والتحميل الزائد - 1اليوم سوف نلقي نظرة فاحصة على جزء لا يتجزأ من الفصول الدراسية مثل الأساليب. الطريقة هي مجموعة من الأوامر التي تسمح لك بإجراء بعض العمليات في البرنامج. بمعنى آخر، الطريقة هي وظيفة؛ شيء يمكن لفصلك القيام به. في لغات البرمجة الأخرى، غالبًا ما تسمى الطرق "وظائف"، ولكن في Java أصبحت كلمة "طريقة" أكثر شيوعًا :) في المحاضرة الأخيرة، إذا كنت تتذكر، أنشأنا طرقًا بسيطة لفئة Cat حتى تتمكن قططنا من المواء والقفز:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();
    }
}
sayMeow()وهي jump()أساليب صفنا. نتيجة عملهم هي الإخراج إلى وحدة التحكم:
Мяу!
Прыг-скок!
أساليبنا بسيطة للغاية: فهي ببساطة تقوم بطباعة النص إلى وحدة التحكم. ولكن في Java، يكون للطرق مهمة رئيسية - حيث يجب عليهم تنفيذ إجراءات على بيانات الكائن . قم بتغيير قيمة بيانات الكائن، أو تحويلها، أو إخراجها إلى وحدة التحكم، أو القيام بشيء آخر بها. أساليبنا الحالية لا تفعل أي شيء مع بيانات الكائن Cat. دعونا نلقي نظرة على مثال أكثر وضوحا:
public class Truck {

    int length;
    int width;
    int height;
    int weight;

    public int getVolume() {
        int volume = length * width * height;
        return volume;
    }
}
على سبيل المثال، لدينا فئة تمثل شاحنة - Truck. مقطورة الشاحنة لها طول وعرض وارتفاع ووزن (سنحتاج إلى ذلك لاحقًا). في الطريقة، getVolume()نقوم بإجراء العمليات الحسابية - نقوم بتحويل بيانات كائننا إلى رقم يشير إلى الحجم (نضرب الطول والعرض والارتفاع). هذا هو الرقم الذي سيكون نتيجة هذه الطريقة. يرجى ملاحظة - في وصف الطريقة هو مكتوب public int getVolume. وهذا يعني أن نتيجة هذه الطريقة يجب أن تكون رقما في النموذج int. لقد حسبنا نتيجة الطريقة، والآن يجب علينا إعادتها إلى برنامجنا الذي يسمى الطريقة. لإرجاع نتيجة إحدى الطرق في Java، يتم استخدام الكلمة الأساسية return.
return volume;

معلمات الطريقة

يمكن للطرق قبول القيم كمدخلات، والتي تسمى "معلمات الطريقة". طريقتنا الحالية getVolume()في الفصل Truckلا تقبل أي معلمات، لذلك دعونا نحاول توسيع المثال مع الشاحنات. لنقم بإنشاء فئة جديدة - BridgeOfficer. ويتواجد ضابط شرطة على الجسر ويقوم بفحص جميع الشاحنات المارة للتأكد من أن حمولاتها لا تتجاوز الحد المسموح به للوزن.
public class BridgeOfficer {

    int maxWeight;

    public BridgeOfficer(int normalWeight) {
        this.maxWeight = normalWeight;
    }

    public boolean checkTruck(Truck truck) {
        if (truck.weight > maxWeight) {
            return false;
        } else {
            return true;
        }
    }
}
تأخذ الطريقة checkTruckمعلمة واحدة كمدخل - جسم الشاحنة Truck، وتحدد ما إذا كان الضابط سيسمح للشاحنة بالصعود إلى الجسر أم لا. المنطق داخل الطريقة بسيط للغاية: إذا تجاوز وزن الشاحنة الحد الأقصى المسموح به، فسترجع الطريقة false. سيتعين عليك البحث عن طريق آخر :( إذا كان الوزن أقل من أو يساوي الحد الأقصى، فيمكنك المرور، وترجع الطريقة true. إذا كنت لا تزال لا تفهم تمامًا عبارات "العودة"، فإن "الطريقة ترجع قيمة". " - لنأخذ استراحة من البرمجة وننظر إلى هذا باستخدام مثال بسيط من الحياة الواقعية :) لنفترض أنك مرضت ولم تكن في العمل لعدة أيام. تأتي إلى قسم المحاسبة بإجازتك المرضية التي يجب عليك دفعها. إذا قمت بإجراء تشبيه مع الأساليب، فإن المحاسب لديه طريقة paySickLeave()("دفع الإجازة المرضية"). تقوم بتمرير شهادة إجازة مرضية لهذه الطريقة كمعلمة (بدونها لن تعمل الطريقة ولن تحصل على أي أجر!). داخل طريقة ورقة العمل، يتم إجراء الحسابات اللازمة (يستخدمها المحاسب لحساب المبلغ الذي يجب أن تدفعه لك الشركة)، ويتم إرجاع نتيجة العمل إليك - مبلغ من المال. البرنامج يعمل بنفس الطريقة. فهو يستدعي طريقة، ويمرر البيانات هناك، ويتلقى النتيجة في النهاية. وهذه هي الطريقة main()لبرنامجنا BridgeOfficer:
public static void main(String[] args) {
    Truck first = new Truck();
    first.weight = 10000;
    Truck second = new Truck();
    second.weight = 20000;

    BridgeOfficer officer = new BridgeOfficer(15000);
    System.out.println("Truck number 1! May I pass, officer?");
    boolean canFirstTruckGo = officer.checkTruck(first);
    System.out.println(canFirstTruckGo);

    System.out.println();

    System.out.println("Truck number 2! May I?");
    boolean canSecondTruckGo = officer.checkTruck(second);
    System.out.println(canSecondTruckGo);
}
نحن نقوم بإنشاء شاحنتين بحمولتين 10.000 و 20.000. وفي نفس الوقت الحد الأقصى لوزن الجسر الذي يكون فيه الضابط في الخدمة هو 15.000. البرنامج يسمى الطريقة ، الطريقة officer.checkTruck(first)تحسب كل شيء وتعيد النتيجة إلى البرنامج - trueوقام البرنامج بحفظه في المتغير boolean canFirstTruckGo. الآن يمكنه أن يفعل بها ما يريد (تمامًا مثلك مع الأموال التي تلقيتها من المحاسب). في نهاية المطاف الكود
boolean canFirstTruckGo = officer.checkTruck(first);
ينحدر إلى
boolean canFirstTruckGo = true;
نقطة مهمة جدًا: returnلا يقوم المشغل بإرجاع نتيجة الطريقة فحسب، بل ينهي عملها أيضًا ! لن يتم تنفيذ جميع التعليمات البرمجية المكتوبة بعد الإرجاع!
public boolean checkTruck(Truck truck) {

    if (truck.weight > maxWeight) {
        return false;
        System.out.println("Turn around, overweight!");
    } else {
        return true;
        System.out.println("Alright, move on!");
    }
}
العبارات التي يقولها الضابط لن يتم إخراجها إلى لوحة التحكم، لأن الطريقة قد أعادت نتيجة بالفعل وأكملت عملها! عاد البرنامج إلى النقطة التي تم فيها استدعاء الطريقة. لا داعي للقلق بشأن هذا بنفسك - فمترجم Java ذكي بما يكفي لإلقاء خطأ إذا حاولت كتابة التعليمات البرمجية بعد return.

المنتقمون: حرب الخيارات

هناك مواقف يتطلب فيها برنامجنا عدة خيارات لكيفية عمل الطريقة. لماذا لا نصنع ذكاءنا الاصطناعي بأنفسنا؟ أمازون لديها Alexa، وYandex لديها Alice، فلماذا نحن أسوأ؟ :) في الفيلم الذي يدور حول Iron Man، ابتكر توني ستارك ذكاءه الاصطناعي المتميز - JARVIS دعونا نشيد بالشخصية الرائعة ونسمي الذكاء الاصطناعي الخاص بنا تكريمًا له :) أول شيء يجب أن نعلمه لجارفيس هو الترحيب بالأشخاص الذين يدخلون الغرفة (سيكون من الغريب أن يتبين أن مثل هذا الفكر العظيم غير مهذب).
public class Jarvis {

    public void sayHi(String name) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
    }
}
إخراج وحدة التحكم:
Добрый вечер, Тони Старк, How ваши дела?
عظيم! يعرف جارفيس كيف يحيي الشخص الذي يدخل. في أغلب الأحيان، بالطبع، سيكون مالكه - توني ستارك. لكنه قد لا يأتي وحده! وتأخذ طريقتنا sayHi()وسيطة واحدة فقط كمدخل. وبناء على ذلك، لن يتمكن إلا من إلقاء التحية على واحد من القادمين، وسيتجاهل الآخر. ليس مهذبا جدا، أتفق؟ :/ في هذه الحالة، لحل المشكلة، يمكننا ببساطة كتابة طريقتين في الفصل بنفس الاسم، ولكن بمعلمات مختلفة:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ", How are you doing?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
    }
}
وهذا ما يسمى أسلوب التحميل الزائد . يتيح التحميل الزائد لبرنامجنا أن يكون أكثر مرونة ويستوعب خيارات العمل المختلفة. دعونا نتحقق من كيفية عمله:
public class Jarvis {

    public void sayHi(String firstGuest) {
        System.out.println("Good evening, " + firstGuest + ", How are you doing?");
    }

    public void sayHi(String firstGuest, String secondGuest) {
        System.out.println("Good evening, " + firstGuest + ", " + secondGuest + ", How are you doing?");
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark");
        jarvis.sayHi("Tony Stark", "Captain America");
    }
}
إخراج وحدة التحكم:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Тони Старк, Капитан Америка, How ваши дела?
رائع، كلا الخيارين نجحا :) لكننا لم نحل المشكلة! ماذا لو كان هناك ثلاثة ضيوف؟ بالطبع يمكننا تحميل الطريقة مرة أخرى sayHi()لقبول أسماء ثلاثة ضيوف. ولكن يمكن أن يكون هناك 4 أو 5 منهم، وهكذا إلى ما لا نهاية. هل هناك طريقة أخرى لتعليم جارفيس العمل مع أي عدد من الأسماء، دون التحميل الزائد على مليون طريقة sayHi()؟ :/ بالطبع! وإلا هل ستكون Java لغة البرمجة الأكثر شعبية في العالم؟ ;)
public void sayHi(String...names) {

    for (String name: names) {
        System.out.println("Good evening, " + name + ", How are you doing?");
    }
}
السجل ( String...names) الذي تم تمريره كمعلمة يسمح لنا بالإشارة إلى أنه تم تمرير عدد معين من السلاسل إلى الطريقة. نحن لا نحدد مسبقًا العدد الذي يجب أن يكون، لذا أصبح تشغيل طريقتنا الآن أكثر مرونة:
public class Jarvis {

    public void sayHi(String...names) {
        for (String name: names) {
            System.out.println("Good evening, " + name + ", How are you doing?");
        }
    }

    public static void main(String[] args) {
        Jarvis jarvis = new Jarvis();
        jarvis.sayHi("Tony Stark", "Captain America", "Black Widow", "Hulk");
    }
}
إخراج وحدة التحكم:
Добрый вечер, Тони Старк, How ваши дела?
Добрый вечер, Капитан Америка, How ваши дела?
Добрый вечер, Черная Вдова, How ваши дела?
Добрый вечер, Халк, How ваши дела?
بعض التعليمات البرمجية هنا غير مألوفة لك، ولكن لا مانع من ذلك. جوهرها بسيط - الطريقة تمر بجميع الأسماء بدورها وتحيي كل ضيف! علاوة على ذلك، فإنه سيعمل مع أي عدد من الخطوط المنقولة! اثنان، عشرة، وحتى ألف - ستعمل الطريقة بشكل موثوق مع أي عدد من الضيوف. إنه أكثر ملاءمة من إجراء عمليات تحميل زائدة لجميع الخيارات الممكنة، ألا توافق على ذلك؟ :) نقطة أخرى مهمة: ترتيب الوسائط مهم! لنفترض أن طريقتنا تأخذ سلسلة ورقمًا كمدخلات:
public class Man {

    public static void sayYourAge(String greeting, int age) {
        System.out.println(greeting + " " + age);
    }

    public static void main(String[] args) {
        sayYourAge("My age - ", 33);
        sayYourAge(33, "My age - "); //error!
    }
}
إذا كانت طريقة sayYourAgeالفصل Manتأخذ سلسلة ورقمًا كمدخلات، فهذا هو الترتيب الذي يجب تمريرها به في البرنامج! إذا مررناها بترتيب مختلف، فسيقوم المترجم بإلقاء خطأ ولن يتمكن الشخص من معرفة عمره. بالمناسبة، المنشئات التي تناولناها في المحاضرة الأخيرة هي أيضًا طرق! يمكن أيضًا تحميلها بشكل زائد (إنشاء عدة مُنشئات بمجموعات مختلفة من الوسائط) كما أن ترتيب تمرير الوسائط مهم جدًا بالنسبة لهم. أساليب حقيقية! :)

ومرة أخرى عن المعلمات

نعم نعم لم ننتهي منهم بعد :) الموضوع الذي سنتناوله الآن مهم جداً. هناك احتمال بنسبة 90% أن يسألوا عن هذا الأمر في جميع مقابلاتك المستقبلية! سنتحدث عن تمرير المعلمات إلى الأساليب. دعونا نلقي نظرة على مثال بسيط:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        currentYear = currentYear-10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year now?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("And now?");
        System.out.println(currentYear);
    }
}
آلة الزمن لها طريقتان. كلاهما يأخذ كمدخل رقمًا يمثل السنة الحالية ويقوم إما بزيادة القيمة أو إنقاصها (اعتمادًا على ما إذا كنا نريد العودة بالزمن إلى الوراء أو إلى المستقبل). ولكن، كما يتبين من مخرجات وحدة التحكم، فإن الطريقة لم تنجح! إخراج وحدة التحكم:
Какой сейчас год?
2020
А сейчас?
2020
لقد مررنا متغيرًا currentYearإلى الطريقة goToPast()، لكن قيمته لم تتغير. وكما كان في عام 2020، فإنه لا يزال كذلك. لكن لماذا؟ :/ لأن الأوليات في Java يتم تمريرها إلى الأساليب حسب القيمة. ماذا يعني ذلك؟ عندما نستدعي أسلوبًا goToPast()ونمرر متغيرنا هناك int currentYear = 2020، ليس المتغير نفسه هو الذي يدخل إلى الأسلوب currentYear، بل نسخة منه . وقيمة هذه النسخة بالطبع تساوي أيضًا 2020، لكن كل التغييرات التي تطرأ على النسخة لا تؤثر بأي شكل من الأشكال على المتغير الأصلي لديناcurrentYear ! لنجعل الكود الخاص بنا أكثر تفصيلاً ونرى ما سيحدث مع currentYear:
public class TimeMachine {

    public void goToFuture(int currentYear) {
        currentYear = currentYear+10;
    }

    public void goToPast(int currentYear) {
        System.out.println("The goToPast method has started!");
        System.out.println("The currentYear value inside the goToPast method (at the beginning) = " + currentYear);
        currentYear = currentYear-10;
        System.out.println("The currentYear value inside the goToPast method (at the end) = " + currentYear);
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        int currentYear = 2020;

        System.out.println("What is the year at the very beginning of the program?");
        System.out.println(currentYear);

        timeMachine.goToPast(currentYear);
        System.out.println("What year is it now?");
        System.out.println(currentYear);
    }
}
إخراج وحدة التحكم:
Какой год в самом начале работы программы?
2020
Метод goToPast начал работу!
Значение currentYear внутри метода goToPast (в начале) = 2020
Значение currentYear внутри метода goToPast (в конце) = 2010
А сейчас Howой год?
2020
يوضح هذا بوضوح أن المتغير الذي تم تمريره إلى الطريقة goToPast()هو مجرد نسخة currentYear. ولم يكن لتغيير النسخة أي تأثير على معنى "الأصل". " التمرير بالإشارة " له معنى معاكس تمامًا. دعونا نتدرب على القطط! أعني، دعونا نرى كيف يبدو المرور عبر الرابط باستخدام القطط كمثال :)
public class Cat {

    int age;

    public Cat(int age) {
        this.age = age;
    }
}
الآن، بمساعدة آلة الزمن الخاصة بنا، سنطلق بارسيك، أول مسافر عبر الزمن في العالم، إلى الماضي والمستقبل! دعونا نغير الفئة TimeMachineحتى تتمكن الآلة من العمل مع الكائنات Cat؛
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat.age -= 10;
    }
}
لا تغير الأساليب الآن الرقم الذي تم تمريره فحسب، بل تغير مجال ageكائن معين Cat. في حالة البدائيين، كما تتذكر، لم ننجح: فالرقم الأصلي لم يتغير. دعونا نرى ما يحدث هنا!
public static void main(String[] args) {

    TimeMachine timeMachine = new TimeMachine();
    Cat barsik = new Cat(5);

    System.out.println("How old is Barsik at the very beginning of the program?");
    System.out.println(barsik.age);

    timeMachine.goToFuture(barsik);
    System.out.println("And now?");
    System.out.println(barsik.age);

    System.out.println("Firs-sticks! Barsik has aged 10 years! Drive back quickly!");
    timeMachine.goToPast(barsik);
    System.out.println("Did it work? Have we returned the cat to its original age?");
    System.out.println(barsik.age);
}
إخراج وحدة التحكم:
Сколько лет Барсику в самом начале работы программы?
5
А теперь?
15
Елки-палки! Барсик постарел на 10 лет! Живо гони назад!
Получилось? Мы вернули коту его изначальный возраст?
5
رائع! الآن عملت الطريقة بشكل مختلف: قطتنا تقدمت في العمر فجأة، ثم بدت أصغر سنًا مرة أخرى! :) دعونا نحاول معرفة السبب. على عكس المثال مع الأوليات، في حالة الكائنات، يتم تمرير مرجع إلى الكائن إلى الطريقة. تم تمرير إشارة إلى كائننا الأصلي goToFuture(barsik)إلى الأساليب . لذلك، عندما نغير الأساليب الداخلية ، فإننا نصل إلى منطقة الذاكرة التي تم تخزين كائننا فيها. هذا رابط لنفس Barsik الذي أنشأناه في البداية. وهذا ما يسمى "التمرير عن طريق المرجع"! ومع ذلك، مع هذه الروابط، كل شيء ليس بهذه البساطة :) دعنا نحاول تغيير مثالنا: goToPast(barsik)barsikbarsik.age
public class TimeMachine {

    public void goToFuture(Cat cat) {
        cat = new Cat(cat.age);
        cat.age += 10;
    }

    public void goToPast(Cat cat) {
        cat = new Cat(cat.age);
        cat.age -= 10;
    }

    public static void main(String[] args) {
        TimeMachine timeMachine = new TimeMachine();
        Cat barsik = new Cat(5);

        System.out.println("How old is Barsik at the very beginning of the program?");
        System.out.println(barsik.age);

        timeMachine.goToFuture(barsik);
        System.out.println("Barsik went to the future! Has his age changed?");
        System.out.println(barsik.age);

        System.out.println("And if you try in the past?");
        timeMachine.goToPast(barsik);
        System.out.println(barsik.age);
    }
}
إخراج وحدة التحكم:
Сколько лет Барсику в самом начале работы программы?
5
Барсик отправился в будущее! Его возраст изменился?
5
А если попробовать в прошлое?
5
لا يعمل مرة أخرى! O_O دعنا نتعرف على ما حدث :) الأمر كله يتعلق بالطرق goToPast/ goToFutureوآليات عمل الروابط. الآن الاهتمام!هذه النقطة هي الأهم في فهم كيفية عمل الروابط والأساليب. في الواقع، عندما نستدعي طريقة ما، goToFuture(Cat cat)لا يتم تمرير مرجع الكائن نفسه إليها cat، بل نسخة من هذا المرجع. أي أنه عندما نقوم بتمرير كائن إلى طريقة ما، هناك مرجعان لهذا الكائن . وهذا مهم جدًا لفهم ما يحدث. ففي النهاية، هذا هو السبب في أن مثالنا الأخير لم يغير عمر القطة. في المثال السابق الخاص بتغيير العمر، قمنا ببساطة بأخذ المرجع الذي تم تمريره داخل الطريقة goToFuture()، ووجدنا الكائن في الذاكرة باستخدامه وقمنا بتغيير عمره ( cat.age += 10). الآن داخل الطريقة goToFuture()نقوم بإنشاء كائن جديد
(cat = new Cat(cat.age)),
ويتم تعيين هذا الكائن لنفس رابط النسخ الذي تم تمريره إلى الطريقة. نتيجة ل:
  • الرابط الأول ( Cat barsik = new Cat(5)) يشير إلى القطة الأصلية (بعمر 5 سنوات)
  • بعد أن قمنا بتمرير المتغير catإلى الطريقة goToPast(Cat cat)وتخصيصه لكائن جديد، تم نسخ المرجع.
بعد ذلك، لدينا الوضع النهائي: رابطان يشيران إلى كائنين مختلفين. ولكننا قمنا بتغيير عمر واحد منهم فقط - وهو الذي أنشأناه داخل الطريقة.
cat.age += 10;
وبطبيعة الحال، عندما نخرجه main()إلى وحدة التحكم في الطريقة barsik.age، نرى أن عمره لم يتغير. بعد كل شيء barsik، هذا متغير مرجعي لا يزال يشير إلى الكائن الأصلي القديم الذي يبلغ عمره 5 أعوام، والذي لم يحدث له شيء. تم إجراء جميع عمليات التلاعب لدينا مع تقدم العمر على كائن جديد. وبالتالي، اتضح أن الكائنات يتم تمريرها إلى الأساليب حسب المرجع. لا يتم إنشاء نسخ من الكائنات تلقائيًا أبدًا. إذا قمت بتمرير كائن قطة إلى طريقة ما وقمت بتغيير عمره، فسوف يتغير بنجاح. ولكن يتم نسخ قيم المتغيرات المرجعية عند تعيين و/أو طرق الاتصال! دعونا نكرر هنا الفقرة المتعلقة بتمرير الأوليات: "عندما نستدعي طريقة changeInt()ونمرر متغيرنا هناك int x = 15، فإن المتغير نفسه ليس هو الذي يدخل إلى الطريقة x، بل نسختها . بعد كل شيء، كل التغييرات التي تحدث للنسخة لا تدخل تؤثر على المتغير الأصلي لدينا بأي شكل من الأشكال x." مع نسخ الروابط، كل شيء يعمل بنفس الطريقة تمامًا! قمت بتمرير كائن القط إلى الطريقة. إذا فعلت شيئًا ما مع القطة نفسها (أي مع الكائن الموجود في الذاكرة)، فستتم جميع التغييرات بنجاح - كان لدينا كائن واحد فقط ولا يزال لدينا. ولكن إذا قمت بإنشاء كائن جديد داخل إحدى الطرق وحفظته في متغير مرجعي، وهو معلمة للطريقة، فمن الآن فصاعدًا لدينا كائنان ومتغيران مرجعيان. هذا كل شئ! لم يكن الأمر بهذه السهولة، بل ربما يتعين عليك إلقاء محاضرة عدة مرات. لكن الشيء الرئيسي هو أنك تعلمت هذا الموضوع المهم للغاية. ستواجه غالبًا حججًا (حتى بين المطورين ذوي الخبرة) حول كيفية تمرير الوسائط في Java. الآن أنت تعرف بالضبط كيف يعمل. استمر! :)
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION