في جافا، تسلسل البناء هو تسلسل الاستدعاء بناة عند تهيئة كائن. يتم استخدامه عندما نريد استدعاء عدد من المنشئات، واحدًا تلو الآخر باستخدام مثيل فقط. في هذا القسم سنناقش تسلسل المنشئ في Java بالتفصيل مع الأمثلة المناسبة. دعونا نلقي نظرة سريعة على ما هو المنشئ في جافا.
البناء
في جافا ، المُنشئ هو نفس الطريقة ولكن الاختلاف الوحيد هو أن المُنشئ له نفس اسم اسم الفئة. يتم استخدامه لإنشاء مثيل للفئة. يتم استدعاؤه تلقائيًا عندما نقوم بإنشاء كائن من الفئة. ليس لديها نوع العودة. تذكر أن المنشئ لا يمكن أن يكون خلاصة , أخير , متزامن , و ثابتة . لا يمكننا تجاوز المنشئ.
هناك نوعان من المنشئ في Java:
- المُنشئ الافتراضي (المعروف أيضًا باسم مُنشئ بدون وسيطات)
- منشئ المعلمة
تسلسل البناء
في سلسلة المنشئ، يتم استدعاء المنشئ من مُنشئ آخر في نفس الفئة التي تُعرف بها هذه العملية تسلسل البناء. ويحدث عن طريق الميراث. عندما نقوم بإنشاء مثيل لفئة مشتقة، يتم استدعاء جميع مُنشئي الفئة الموروثة (الفئة الأساسية) أولاً، وبعد ذلك يتم استدعاء مُنشئ الفئة المستدعية (الفئة المشتقة).
يمكننا تحقيق تسلسل المنشئ بطريقتين:
طول المصفوفة جافا
تذكر أن تغيير ترتيب المنشئ لا يؤثر على الإخراج.
الحاجة إلى تسلسل المنشئ
لنفترض أن هناك خمس مهام يجب تنفيذها. هناك طريقتان لتنفيذ هذه المهام، إما تنفيذ جميع المهام في منشئ واحد أو إنشاء مهام منفصلة في منشئ واحد.
باستخدام آلية تسلسل المنشئ، يمكننا تنفيذ مهام متعددة في منشئ واحد. لذلك، عندما نواجه مثل هذه الأنواع من المشاكل، يجب علينا استخدام تسلسل المنشئ. يمكننا أن نجعل البرنامج أكثر قابلية للقراءة والفهم باستخدام تسلسل المنشئ.
قواعد تسلسل المنشئ
- التعبير الذي يستخدم هذا يجب أن تكون الكلمة الأساسية هي السطر الأول من المنشئ.
- يجب أن يكون هناك منشئ واحد على الأقل لا يستخدم هذا
استدعاء المنشئ من منشئ آخر
يمكن إجراء استدعاء المنشئ بطريقتين:
ملحوظة: في نفس كتلة البناء، لا يمكننا استخدام this() وsuper() في وقت واحد.
دعونا نفهم هذين المفهومين من خلال برامج جافا.
أمثلة على تسلسل المنشئ
استدعاء منشئ الفئة الحالية
نحن نستخدم هذا() الكلمة الأساسية إذا أردنا استدعاء مُنشئ الفصل الحالي داخل نفس الفصل. استخدام this() إلزامي لأن JVM لا تضعه تلقائيًا مثل ممتاز() الكلمة الرئيسية. لاحظ أن هذا () يجب أن يكون السطر الأول من المنشئ. يجب أن يكون هناك مُنشئ واحد على الأقل بدونه هذه الكلمة الأساسية (). .
أساسيات جافا
بناء الجملة:
this(); or this(parameters list);
على سبيل المثال:
this(); this('Javatpoint');
لنقم بإنشاء برنامج Java واستدعاء مُنشئ الفصل الحالي.
ConstructorChain.java
public class ConstructorChain { //default constructor ConstructorChain() { this('Javatpoint'); System.out.println('Default constructor called.'); } //parameterized constructor ConstructorChain(String str) { System.out.println('Parameterized constructor called'); } //main method public static void main(String args[]) { //initializes the instance of example class ConstructorChain cc = new ConstructorChain(); } }
انتاج:
في المثال أعلاه، قمنا بإنشاء مثيل للفئة دون تمرير أي معلمة. يقوم أولاً باستدعاء المُنشئ الافتراضي ويقوم المُنشئ الافتراضي بإعادة توجيه الاستدعاء إلى المُنشئ ذي المعلمات بسبب هذا (). يتم تنفيذ البيانات الموجودة داخل المنشئ ذو المعلمات وتعود إلى المنشئ الافتراضي. بعد ذلك، يتم تنفيذ بقية العبارات في المنشئ الافتراضي وتتم تهيئة الكائن بنجاح. ما يلي هو تسلسل استدعاء المنشئ:
ConstructorChain cc = new ConstructorChain(); -> ConstructorChain() -> ConstructorChain(String str) -> System.out.println() -> ConstructorChain() -> System.out.println()
استدعاء منشئ فئة سوبر
في بعض الأحيان، نحتاج إلى استدعاء مُنشئ الفئة الفائقة (الفئة الأصلية) من الفئة الفرعية (الفئة المشتقة) في مثل هذه الحالات، نستخدم الكلمة الأساسية super() في مُنشئ الفئة المشتقة. يعد كتابة super() اختياريًا لأن JVM يضعها تلقائيًا. يجب أن يكتب دائما في السطر الأول. نحصل على خطأ في بناء الجملة إذا حاولنا استدعاء مُنشئ الطبقة الفائقة في الفئة الفرعية.
عجلة التمرير لا تعمل
بناء الجملة:
super(); or super(Parameter List);
ممتاز(): إنه يستدعي المُنشئ الافتراضي أو بدون وسيطة للفئة الفائقة.
سوبر (المعلمات): إنه يستدعي مُنشئ معلمات الطبقة الفائقة.
تذكر أنه لا يمكن وراثة مُنشئ الفئة الفائقة في الفئة الفرعية. يمكن استدعاؤه من مُنشئ الفئة الفرعية باستخدام الكلمة الأساسية super.
لنقم بإنشاء برنامج Java وتنفيذ تسلسل المُنشئ في فئة موروثة.
جافا الرياضيات الأسرى
ConstructorChaining.java
//parent class or base class class Demo { //base class default constructor Demo() { this(80, 90); System.out.println('Base class default constructor called'); } //base class parameterized constructor Demo(int x, int y) { System.out.println('Base class parameterized constructor called'); } } //derived class or child class class Prototype extends Demo { //derived class default constructor Prototype() { this('Java', 'Python'); System.out.println('Derived class default constructor called'); } //derived class parameterized constructor Prototype(String str1, String str2) { super(); System.out.println('Derived class parameterized constructor called'); } } public class ConstructorChaining { //main method public static void main(String args[]) { //initializes the instance of example class Prototype my_example = new Prototype(); } }
انتاج: