JavaRush /مدونة جافا /Random-AR /مقدمة للفصول الدراسية: كتابة الفصول الدراسية الخاصة بك، و...

مقدمة للفصول الدراسية: كتابة الفصول الدراسية الخاصة بك، والمنشئين

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

    String name;
    int age;

}
لنفترض أننا نكتب برنامجًا، وفي هذا البرنامج نحتاج إلى قطط لشيء ما (على سبيل المثال، لدينا عيادة بيطرية لديها القدرة على تحديد موعد عبر الإنترنت). لقد أنشأنا فئة وحددنا Catمتغيرين لها - سلسلة nameورقم age. تسمى متغيرات الفئة هذه الحقول . في الأساس، هذا نموذج لجميع القطط التي سنقوم بإنشائها في المستقبل. سيكون لكل قطة (كائن فئة Cat) متغيرين - الاسم والعمر.
public class Cat {

    String name;
    int age;

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

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

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

    String name;
    int age;

    static int count = 0;

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

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
إخراج وحدة التحكم:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
الآن لدينا متغير جديد في صفنا - count(الكمية). وهي المسؤولة عن إحصاء القطط المخلوقة. في كل مرة نقوم بإنشاء قطة في الطريقة الرئيسية، نقوم بزيادة هذا المتغير بمقدار 1. يتم تحديد هذا المتغير بواسطة الكلمة الأساسية الثابتة . وهذا يعني أنه ينتمي إلى الفئة ، وليس إلى كائن معين من الفئة. وهذا أمر منطقي بالطبع: إذا كان لكل قطة اسمها الخاص، فنحن بحاجة إلى عداد قطة واحد للجميع. هذا هو بالضبط ما تسمح لك الكلمة الثابتة بتحقيقه - countنفس المتغير لجميع القطط. يرجى ملاحظة: عندما نطبعه على وحدة التحكم، لا نكتب barsik.countأو vasia.count. إنها لا تنتمي إلى بارسيك أو فاسيا - إنها تنتمي إلى الفصل بأكمله Cat. لذلك، الأمر بسيط count. يمكنك أيضًا الكتابة Cat.count- وسيكون ذلك صحيحًا أيضًا. nameلن ينجح هذا مع إخراج متغير إلى وحدة التحكم :
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
خطأ! nameكل قطة لها خاصتها. هذا هو المكان الذي يتم فيه الخلط بين المترجم. "أخرج الاسم إلى وحدة التحكم؟ من هو الاسم؟ :/"

طُرق

بالإضافة إلى المتغيرات، كل فئة لديها أساليب. وسنتحدث عنها في محاضرة منفصلة بمزيد من التفصيل، لكن النقاط العامة بسيطة للغاية. الأساليب هي وظيفة صفك؛ ما يمكن أن تفعله كائنات هذه الفئة. أنت على دراية بإحدى الطرق بالفعل - وهذا هو main(). لكن الطريقة main، كما تتذكر، ثابتة - أي أنها تنتمي إلى الفصل بأكمله (المنطق هو نفسه كما هو الحال مع المتغيرات). ولا يمكن استدعاء الأساليب العادية غير الثابتة إلا على كائنات محددة أنشأناها. على سبيل المثال، إذا أردنا كتابة فصل دراسي لقطة، فنحن بحاجة إلى فهم الوظائف التي يجب أن تكون لدى القطة في برنامجنا. وبناء على ذلك، دعونا نكتب طريقتين لذلك:
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();

    }
}
حسنًا، الآن أصبح فصلنا أشبه بوصف قطة حقيقية! الآن ليس لدينا فقط قطة تدعى بارسيك لها اسم وعمر. يمكنه أيضًا المواء والقفز! أي نوع من القطط بدون مثل هذه "الوظيفة" :) نحن نأخذ كائنًا محددًا - barsikونطلق على أساليبه sayMeow()و jump(). نحن ننظر إلى وحدة التحكم:

Мяу!
Прыг-скок!
قطة حقيقية! :)

إنشاء الفصول الدراسية الخاصة بك. التجريد

في المستقبل سيكون عليك كتابة دروسك الخاصة. ما الذي يجب عليك الانتباه إليه عند كتابتها؟ إذا كنا نتحدث عن المتغيرات، فأنت بحاجة إلى استخدام ما يسمى التجريد . التجريد هو أحد المبادئ الأربعة الأساسية للبرمجة الشيئية. إنه يتضمن تسليط الضوء على الخصائص الرئيسية والأكثر أهمية للكائن ، والعكس - التخلص من الخصائص الثانوية غير المهمة. على سبيل المثال، نقوم بإنشاء ملف لموظفي الشركة. لإنشاء كائنات الموظفين، كتبنا فئة Employee. ما هي الخصائص المهمة لوصف الموظف في ملف الشركة؟ الاسم الكامل، تاريخ الميلاد، رقم الضمان الاجتماعي، رقم التعريف الضريبي. لكن من غير المرجح أن نحتاج إلى طوله وعينيه ولون شعره في بطاقة موظف الشركة. الشركة لا تحتاج إلى هذه المعلومات. لذلك، بالنسبة للفصل ، Employeeسنقوم بتعيين المتغيرات String nameو int ageو int socialInsuranceNumberو int taxNumber، وسنتخلى عن المعلومات غير الضرورية بالنسبة لنا (مثل لون العين) ونقوم بتجريدها بعيدًا . ولكن إذا قمنا بإنشاء ملف من نماذج الصور لوكالة عرض الأزياء، فإن الوضع يتغير بشكل كبير. لوصف عارضة أزياء، يعد الطول ولون العين ولون الشعر أمرًا مهمًا جدًا بالنسبة لنا، لكن رقم التعريف الضريبي ليس مهمًا بالنسبة لنا على الإطلاق. لذلك، في الفصل نحن بحاجة إلى Modelإنشاء متغيرات int height، String hair. String eyesهذه هي الطريقة التي يعمل بها التجريد، الأمر بسيط! :)

البنائين

دعونا نعود إلى مثال القط لدينا.
public class Cat {

    String name;
    int age;

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

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

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

    String name;
    int age;

    //constructor for class Cat
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
المنشئ هو في الأساس قالب لكائنات الفئة. في هذه الحالة، نحدد أنه يجب تحديد وسيطتين لكل كائن cat- سلسلة ورقم. إذا حاولنا الآن إنشاء قطة بلا اسم، فلن ننجح.
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
الآن بعد أن أصبح لدى الفصل مُنشئ، يعرف مترجم Java الشكل الذي يجب أن تبدو عليه الكائنات ولا يسمح بإنشاء الكائنات بدون الوسائط المحددة فيه. الآن دعونا نلقي نظرة على الكلمة الأساسية thisالتي تراها داخل المُنشئ. كل شيء بسيط معه أيضًا. "هذا" في اللغة الإنجليزية يعني "هذا، هذا". أي أن هذه الكلمة تشير إلى كائن معين. الكود في المنشئ
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
يمكن ترجمته بشكل حرفي تقريبًا: " اسم هذه القطة (التي نقوم بإنشائها) = وسيطة الاسم المحددة في المُنشئ. العمر لهذه القطة (التي نقوم بإنشائها) = وسيطة العمر المحددة في المُنشئ." بعد إطلاق المُنشئ، يمكنك التحقق من تعيين جميع القيم الضرورية لقطتنا:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
إخراج وحدة التحكم:

Барсик
5
عندما يكتمل المنشئ:
Cat barsik = new Cat("Barsik", 5);
وفعلاً حدث ما يلي في الداخل:
this.name = "Barsik";
this.age = 5;
وتم تعيين قيم للكائن barsik(هو this) من وسيطات المنشئ. في الواقع، إذا لم تحدد المُنشئين في الفصل، فسيظل يطلق المُنشئ ! ولكن كيف يكون هذا ممكنا؟ O_O الحقيقة هي أن جميع الفئات في Java لها ما يسمى بالمنشئ الافتراضي . لا يحتوي على أية وسائط، ولكنه يتم تشغيله في كل مرة يتم فيها إنشاء أي كائن من أي فئة.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
للوهلة الأولى هذا ليس ملحوظا. حسنًا، لقد خلقنا شيئًا وأبدعناه، أين عمل المصمم؟ لرؤية ذلك، دعونا نكتب Catمنشئًا فارغًا للفصل بأيدينا، وداخله سنخرج بعض العبارات إلى وحدة التحكم. إذا تم عرضه، فهذا يعني أن المنشئ قد عمل.
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
إخراج وحدة التحكم:

Создали кота!
هنا التأكيد. المنشئ الافتراضي موجود دائمًا بشكل غير مرئي في فصولك الدراسية. ولكن عليك أن تعرف ميزة أخرى منه. يختفي المُنشئ الافتراضي من الفصل عند إنشاء مُنشئ باستخدام الوسائط. والدليل على ذلك، في الواقع، رأيناه بالفعل أعلاه. هنا في هذا الكود:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
لم نتمكن من إنشاء قطة بدون اسم وعمر لأننا حددنا مُنشئًا لـ Cat: سلسلة + رقم. اختفى المنشئ الافتراضي من الفصل مباشرة بعد ذلك. لذلك، تأكد من تذكر: إذا كنت بحاجة إلى العديد من المنشئين في فصلك، بما في ذلك واحد فارغ، فأنت بحاجة إلى إنشائه بشكل منفصل . على سبيل المثال، تريد عيادتنا البيطرية عمل الخير ومساعدة القطط المشردة التي لا نعرف أسمائها وأعمارها. ثم يجب أن يبدو الكود الخاص بنا كما يلي:
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
الآن بعد أن حددنا مُنشئًا افتراضيًا بشكل صريح، يمكننا إنشاء كلا النوعين من القطط. في المنشئ، يمكنك تعيين القيم بشكل صريح، وليس فقط أخذها من الوسائط. على سبيل المثال، يمكننا تسجيل جميع قطط الشوارع في قاعدة بيانات تحت اسم "رقم قطط الشوارع...":
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
لدينا متغير countوهو عداد قطط الشوارع. في كل مرة نقوم فيها بتشغيل المُنشئ الافتراضي، نقوم بزيادته بمقدار 1 ونخصص هذا الرقم كاسم للقطة. بالنسبة للمنشئ، ترتيب الوسائط مهم جدًا. لنقم بتبديل وسيطات الاسم والعمر في مُنشئنا.
public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 10); //error!
    }
}
خطأ! يصف المنشئ بوضوح ما يلي: عند إنشاء كائن، Catيجب تمرير رقم وسلسلة، بهذا الترتيب . لهذا السبب لا يعمل الكود الخاص بنا. تأكد من تذكر ذلك ووضعه في الاعتبار عند إنشاء فصولك الدراسية الخاصة:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
هذان مصممان مختلفان تمامًا! الآن قم بحل بعض المشكلات لتوحيد المادة :)
  • متحف الآثار.
مهمتك هي تصميم الفصل Artifact. القطع الأثرية المحفوظة في المتحف هي من ثلاثة أنواع. الأول: لا يُعرف عنه سوى الرقم التسلسلي المخصص من قبل المتحف (مثلاً: 212121). والثاني هو الذي يُعرف عنه الرقم التسلسلي والثقافة التي تم إنشاؤه بها (على سبيل المثال: 212121، “الأزتيك”). النوع الثالث: وهو الذي يُعرف عنه الرقم التسلسلي، والثقافة التي تم إنشاؤه بها، والعمر الدقيق لإنشائه (على سبيل المثال: 212121، “الأزتيك”، 12). إنشاء فصل Artifactيصف الآثار المخزنة في المتحف، ويكتب العدد المطلوب من المنشئين له. في الطريقة main()، قم بإنشاء قطعة أثرية واحدة من كل نوع.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • موقع الاجتماع
أنت تقوم بإنشاء قاعدة بيانات مستخدم لموقع مواعدة. لكن المشكلة هي أنك نسيت الترتيب الذي يجب تحديده به، وليس لديك المواصفات الفنية في متناول اليد. صمم فصلًا Userيحتوي على حقول - الاسم ( String) والعمر ( short) والارتفاع ( int). قم بإنشاء العدد المطلوب من المنشئين له بحيث يمكن تحديد الاسم والعمر والطول بأي ترتيب.
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION