CodeGym /مدونة جافا /Random-AR /فئات جافا: كتابة الفصول الدراسية الخاصة بك، والمنشئين
John Squirrels
مستوى
San Francisco

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

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

    String name;
    int age;

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

    String name;
    int age;

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

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
    }

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

    String name;
    int age;

    static int count = 0;

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

        Cat fluffy = new Cat();
        fluffy.age = 5;
        fluffy.name = "Fluffy";
        count++;

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
        System.out.println("We created a cat named " + fluffy.name + ". His age is " + fluffy.age);

        System.out.println("Total number of cats = " + count);
    }
}
إخراج وحدة التحكم: لقد أنشأنا قطة اسمها Smudge. عمره 3 سنوات لقد أنشأنا قطة اسمها فلافي. عمره 5 إجمالي عدد القطط = 2 الآن لدى صفنا متغير جديد يسمى العدد. وهي المسؤولة عن عد القطط التي تم إنشاؤها. في كل مرة نقوم بإنشاء قطة في الطريقة الرئيسية ، نقوم بزيادة هذا المتغير بمقدار 1. يتم الإعلان عن هذا المتغير باستخدام الكلمة الأساسية static. وهذا يعني أنه ينتمي إلى الفئة، وليس إلى كائن معين من الفئة. وهذا أمر منطقي بالطبع: اسم كل قطة ينتمي إلى تلك القطة المحددة، ولكننا نحتاج إلى عداد قطة واحد ينطبق عليها جميعًا. هذا هو بالضبط ما تحققه الكلمة الأساسية static: فهي تجعل متغير العدد متغيرًا واحدًا لجميع القطط. ملاحظة: عندما نعرض المتغير، فإننا لا نستخدم smudge.count أو fluffy.count. لا ينتمي إلى Smudge أو Fluffy؛ إنه ينتمي إلى فئة Cat بأكملها . لهذا السبب فهو ببساطة العد. يمكنك أيضًا كتابة Cat.count. وهذا من شأنه أن يكون صحيحا أيضا. عند عرض متغير الاسم، لن نقوم بما يلي:
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        System.out.println("We created a cat named " + name + ". His age is " + smudge.age);

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

طُرق

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

    String name;
    int age;

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

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

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

        smudge.sayMeow();
        smudge.jump();

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

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

في المستقبل، سيكون عليك كتابة دروسك الخاصة. ما الذي تحتاج إلى البحث عنه عند كتابتها؟ إذا كنا نتحدث عن المتغيرات، فسوف تحتاج إلى الاستفادة من شيء يسمى التجريد. التجريد هو أحد المبادئ الأربعة الأساسية للبرمجة الشيئية. ويعني استخراج الخصائص الأكثر أهمية وأهمية لعنصر ما، وعلى العكس من ذلك، تجاهل تلك الخصائص الثانوية أو غير المهمة. على سبيل المثال، لنقم بإنشاء خزانة ملفات لموظفي الشركة. لإنشاء كائنات الموظف، قمنا بكتابة فئة الموظف . ما هي الخصائص التي تعتبر أوصافًا مهمة للموظف في خزانة الملفات الخاصة بشركتنا؟ الاسم وتاريخ الميلاد ورقم الضمان الاجتماعي ومعرف الموظف. لكن من غير المرجح أن نحتاج إلى طول الموظف أو لون عينيه أو لون شعره في سجل موظفي الشركة. الشركات لا تحتاج إلى هذه المعلومات. لذا، في فئة الموظف ، نعلن عن المتغيرات التالية: String name و int age و int socialSecurityNumber و int memberId . ونترك المعلومات غير الضرورية (مثل لون العين). وبعبارة أخرى، نحن نخلق التجريد. ومع ذلك، إذا قمنا بإنشاء خزانة ملفات لوكالات عرض الأزياء، فإن الوضع يتغير بشكل كبير. يعد طول العارضة ولون عينيها ولون شعرها من الخصائص المهمة، لكن رقم التأمين الاجتماعي (SSN) الخاص بها لا يهمنا على الإطلاق. لذلك، في فئة النموذج ، نحتاج إلى إنشاء المتغيرات التالية: ارتفاع السلسلة ، سلسلة الشعر ، سلسلة العيون . هذه هي الطريقة التي يعمل بها التجريد – إنه سهل! :)

البنائين

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

    String name;
    int age;

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

        System.out.println("Here the program does something for 2 hours...");

        smudge.age = 3;
        smudge.name = "Smudge";

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

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
    }
}
في الأساس، المُنشئ هو قالب لكائنات الفئة. في هذه الحالة، نشير إلى أنه يجب تحديد وسيطتين، String و int ، لكل كائن 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 smudge = 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 smudge = new Cat("Smudge", 5);
        System.out.println(smudge.name);
        System.out.println(smudge.age);
    }
}
إخراج وحدة التحكم: Smudge 5 عندما تم استدعاء المنشئ:
Cat smudge = new Cat("Smudge", 5);
وهذا ما حدث بالفعل في الداخل:
this.name = "Smudge";
this.age = 5;
وتم تعيين قيم الوسيطات التي تم تمريرها إلى المنشئ إلى كائن التلطيخ (وهذا ما يشير إليه هذا في هذه الحالة). في الواقع، حتى لو لم تعلن عن أي مُنشئ في الفصل الدراسي، فسيظل يستدعي مُنشئًا! كيف يمكن ان يكون ذلك ممكن؟ О_О لأن جميع فئات Java لديها ما يسمى بالمنشئ الافتراضي. لا يتطلب الأمر أية وسائط، ولكن يتم استدعاؤه في كل مرة تقوم فيها بإنشاء أي كائن من أي فئة.
public class Cat {

    public static void main(String[] args) {

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

    public Cat() {
        System.out.println("A cat has been created!");
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
إخراج وحدة التحكم: تم إنشاء قطة! هناك التأكيد. المنشئ الافتراضي موجود دائمًا بشكل غير مرئي في فصولك الدراسية. لكن عليك أن تعرف شيئًا آخر عنه. يتم حذف المُنشئ الافتراضي من الفصل الدراسي بمجرد إنشاء مُنشئ باستخدام الوسائط. في الواقع، لقد رأينا بالفعل دليلاً على ذلك أعلاه. وكان في هذا الكود:
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 smudge = new Cat(); // Error!
    }
}
لم نتمكن من إنشاء قطة بدون اسم وعمر، لأننا أعلنا عن مُنشئ قطة بمعلمات سلسلة وint. أدى هذا إلى اختفاء المُنشئ الافتراضي على الفور من الفصل. لذا تأكد من تذكر أنه إذا كنت بحاجة إلى العديد من المُنشئات في صفك، بما في ذلك مُنشئ بدون وسيطات، فسيتعين عليك الإعلان عنها بشكل منفصل. تريد عيادتنا القيام بأعمال الخير ومساعدة القطط المشردة التي لا تعرف أسمائها وأعمارها. ثم يجب أن يبدو الكود الخاص بنا كما يلي:
public class Cat {

    String name;
    int age;

    // For cats with owners
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // For street cats
    public Cat() {
    }

    public static void main(String[] args) {

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

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat No. " + 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);
    }
}
لدينا متغير عدد ، والذي يقوم بإحصاء قطط الشوارع لدينا. في كل مرة يتم فيها تنفيذ المُنشئ الافتراضي، نقوم بزيادة العدد بمقدار 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 smudge = new Cat("Smudge", 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;
}
هذان منشئان مختلفان تمامًا! الآن، أكمل بعض المهام لتعزيز فهمك للمادة. :)
  1. متحف الآثار.

    مهمتك هي تصميم فئة قطعة أثرية .
    هناك ثلاثة أنواع من القطع الأثرية المحفوظة في المتحف.
    ولا نعرف شيئًا عن النوع الأول سوى الرقم التسلسلي المخصص له من قبل المتحف (على سبيل المثال: 212121).
    بالنسبة للنوع الثاني، نعرف الرقم التسلسلي والثقافة التي أنشأته (على سبيل المثال: 212121، "الأزتيك").
    أما النوع الثالث، فنعرف الرقم التسلسلي، والثقافة التي أنشأته، والقرن الذي تم إنشاؤه فيه (على سبيل المثال: 212121، "الأزتيك"، 12).

    أنشئ فصلًا للقطع الأثرية يصف الآثار المحفوظة في المتحف، واكتب المجموعة المطلوبة من المنشئين للفصل. ثم، في الطريقة main() ، قم بإنشاء قطعة أثرية واحدة من كل نوع.

    public class Artifact {
    
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
  2. موقع التعارف

    لنقم بإنشاء قاعدة بيانات مستخدم لموقع مواعدة.
    ولكن هنا تكمن المشكلة: لقد نسيت الترتيب المطلوب للوسائط، ولا توجد وثائق فنية متاحة.
    صمم فئة مستخدم ، والتي ستحتوي على الحقول التالية: الاسم ( String ) والعمر ( short ) والارتفاع ( int ).
    قم بإنشاء العدد المناسب من المُنشئين، بحيث يمكن تحديد الاسم والعمر والطول بأي ترتيب.

    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
    
        }
    }
لتعزيز ما تعلمته، نقترح عليك مشاهدة درس فيديو من دورة Java الخاصة بنا
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION