المصدر: هاكنون
ما هو المنشئ؟
المُنشئ هو طريقة خاصة محددة في فئة تحمل نفس اسم الفئة. يشبه مُنشئ Java الطريقة التي لا تحتوي على نوع إرجاع. يلعب المنشئون الدور الأكثر أهمية في تهيئة الكائنات، وفي هذه المقالة، سنقوم بإدراج نماذج من أسئلة المقابلة التي تغطي المنشئين في Java. ستتعرف أيضًا على أهمية المنشئات في Java، وراجع أمثلة التعليمات البرمجية والتفاصيل المهمة الأخرى التي ستساعدك في الإجابة على الأسئلة المتعلقة بمنشئي Java في المقابلة.لماذا هناك حاجة للمصممين؟ شرح بالتفصيل
لنفترض أن لدينا فئة تسمى Student . ولدينا اسم متغير المثيل و roll_number .class Student{
String name;
int rollNo;
}
الآن، إذا قمنا بإنشاء 1000 كائن، فسيقوم JVM بتهيئة هذه القيم بنوعها الافتراضي Name = null و rollNo = 0 . لا يمكن تحديد هذه الكائنات الفردية، وسيؤدي تعيين قيم لكل كائن إلى زيادة كمية التعليمات البرمجية، وهو ما يعتبر ممارسة برمجية سيئة. لذلك، لتجنب هذا، يتم استخدام المنشئات. أي أن الغرض من المُنشئ في Java هو تهيئة قيمة متغيرات مثيل الفئة.
ما هي أنواع المنشئات الموجودة في Java؟
هناك ثلاثة أنواع مختلفة من المنشئات في Java:- المنشئ الافتراضي
- منشئ بلا وسيطة
- منشئ المعلمة
ما هو المنشئ الافتراضي في جافا؟
المُنشئ الافتراضي هو مُنشئ تم إنشاؤه بواسطة JVM في وقت التشغيل إذا لم يتم تحديد مُنشئ في الفصل. تتمثل المهمة الرئيسية للمنشئ الافتراضي في تهيئة قيم المثيلات وفقًا لنوعها الافتراضي. مثال للمنشئ الافتراضي في Java:class DefaultConstructor{
int id;
String name;
}
الآن بالنسبة لهذه الفئة، إذا قمنا بإنشاء كائن، فسيكون هناك مُنشئ افتراضي داخل JVM والذي يُعطى قيمة افتراضية.
DefaultConstructor df= new DefaultConstructor();
الآن إذا قمنا بطباعة القيمة سنحصل على:
طباعة = df.id = 0.df.name = null.
ما هو المنشئ بدون وسيطة؟
المُنشئ بدون وسيطة هو مُنشئ يمكن تعريفه بشكل صريح لتهيئة قيمة المثيلات. على سبيل المثال:class NoArgConstuctor{ int a; int b;
//No Argument Constructor
NoArgConstuctor(){
a = 10;
b = 20;
}
}
ما هو منشئ المعلمات؟
المُنشئ ذو المعلمات هو مُنشئ يقبل معلمة لتهيئة المثيلات. على سبيل المثال:class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}
ما هي قواعد تحديد المنشئ؟
لتحديد المُنشئين، يجب عليك اتباع عدة قواعد:-
يجب أن يتطابق اسم المنشئ مع اسم الفئة.
-
لا ينبغي أن يكون هناك نوع إرجاع مُنشئ في Java.
-
المعدلات الوحيدة القابلة للتطبيق للمنشئين هي:
- عام
- تقصير
- محمي
- خاص
-
يمكن للبناة أن يأخذوا أي عدد من المعلمات.
-
لا يُسمح باستخدام المُعدِّلات النهائية والمتزامنة والثابتة والمجردة في المُنشئ.
-
لا يدعم المُنشئ بيان الإرجاع داخل جسمه.
-
يمكن أن تكون هناك استثناءات مع بيان الرمي في المنشئ .
-
من المقبول استخدام جملة الرميات مع المُنشئ.
-
لا ينبغي للمنشئ إنشاء العودية.
متى يمكننا استخدام منشئ خاص؟
إذا كنا لا نريد إنشاء كائنات من فئة معينة من الخارج، فيمكننا استخدام المنشئات المغلقة أو الخاصة. من خلال إعلان المنشئين خاصين، يمكننا إنشاء كائنات داخل الفصل فقط. تعد فئات Singleton مثالًا جيدًا على استخدام المنشئين الخاصين.ما هو معدل الوصول الافتراضي للمنشئ إذا لم نحدده بشكل صريح؟
سيكون معدل الوصول للمنشئ الافتراضي هو نفسه دائمًا معدل الفئة. إذا كان الفصل عامًا، فسيكون المنشئ عامًا أيضًا. إذا كان الفصل خاصًا، فسيكون المنشئ خاصًا أيضًا. سيحدث نفس الشيء مع معدّلات الوصول الأخرى.اكتب مخرجات مقتطف الكود أدناه واشرحه
class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
سيتم طباعة الكود أعلاه:
مرحبًا بك في InterviewBit. مرحبًا بك في أكاديمية Scaler بواسطة InterviewBit.
سنحصل على هذا الناتج لأنه إذا لم نقم بتضمين الكلمة الأساسية super() أو this() في المُنشئ في السطر الأول، فسيقوم JVM بوضعها تلقائيًا في وقت التشغيل. يقوم JVM بذلك لأنه يرث من فئة أخرى وسيتم أيضًا تنفيذ وظائفه في الفئة المشتقة. وبالتالي، عند تعيين القيم الافتراضية لمثيلات الفئة الأساسية، يضيف JVM الكلمة الأساسية super() افتراضيًا .
راجع الرمز وحدد ما إذا كان صالحًا أم غير صالح. اشرح السبب
class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
this();
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
الكود أعلاه غير صالح لأنه نفس المنشئ الموجود داخل مُنشئ Scaler Academy . يؤدي هذا إلى إنشاء التكرار في المنشئ، وهو أمر غير مسموح به. وفقًا لذلك، سنتلقى خطأً في وقت الترجمة مرتبطًا باستدعاء المُنشئ العودي.
هل يمكننا استخدام منشئين في فئة واحدة في Java؟
نعم يمكننا استخدام أي عدد من المنشئات في صنف واحد بشرطين:- يجب أن تكون معلمات المنشئ مختلفة.
- لا ينبغي أن يكون هناك تكرار في المنشئ.
InterviewBit(){
this("Scaler"); // Calling parameterized constructor
System.out.println(" No Argument Constructor");
}
InterviewBit(String name){
this(); // Calling no-arg constructor
System.out.println(" Constructor with Parameters.");
}
هذا الرمز غير صالح لأنه سيقوم بإنشاء تكرار. سوف يستدعي المُنشئ الذي لا يحتوي على وسائط مُنشئًا يحتوي على معلمات، وسيستدعي المُنشئ الذي لا يحتوي على معلمات مُنشئًا بدون وسائط.
هل يمكننا تجاوز المنشئ في Java؟
لا، مفهوم التحميل الزائد للمنشئ غير قابل للتطبيق في Java.هل يمكن للمنشئ أن يكون نهائيًا في Java؟
لا يمكن لأي منشئ أن يكون نهائيًا. وذلك لأنه يتم استخدام الكلمات الأساسية النهائية لإيقاف تجاوز طريقة ما في فئة مشتقة. ولكن في المُنشئ، لا ينطبق مفهوم التجاوز، لذلك ليست هناك حاجة لكتابة الكلمة الأساسية النهائية . إذا كتبنا الكلمة الأساسية النهائية في المنشئ، فسوف نحصل على خطأ في وقت الترجمة يسمى نوع الإرجاع المطلوب لأن المترجم يعاملها كطريقة.هل يمكن للمنشئ أن يكون ثابتًا في Java؟
لا، لا يمكن أن يكون مُنشئ Java ثابتًا. وذلك لأنه يتم استخدام الكلمات الأساسية الثابتة عندما نريد أن ينتمي العضو إلى فئة بدلاً من كائن. ولكن المقصود من المنشئات هو تهيئة الكائنات، لذلك سيتعامل معها المترجم كطريقة. سنحصل على خطأ في نوع الإرجاع المطلوب .صف الفرق بين super() وsuper وthis() وهذا
super() و this() هما استدعاءات منشئة. يتم استخدامه فقط لاستدعاء مُنشئ الفئة الأصلية أو الفئة الحالية. لاحظ أن "super" و"this" هما كلمتان أساسيتان تستخدمان لتعيين أعضاء مثيل لفئته الخاصة أو فئة أساسية. خذ بعين الاعتبار الكود أدناه:class InterviewBit{
String message = " Welcome to InterviewBit";
}
public class Scaler extends InterviewBit
{
String message = " Welcome to Scaler Academy";
public void printMethod(){
//this will print the message variable of the current class.
System.out.println(this.message);
//this will print the message variable of Base class.
System.out.println(super.message);
}
public static void main(String[] args) {
Scaler sa = new Scaler();
sa.printMethod();
}
}
في مقتطف الكود هذا، ستطبع هذه الرسالة الرسالة " مرحبًا بك في أكاديمية Scaler " وستطبع الرسالة الفائقة " مرحبًا بك في InterviewBit ". هذه هي الطريقة التي يتم بها استخدام هاتين الكلمتين الأساسيتين للإشارة إلى مثيلات الأعضاء للفئات الأساسية والمشتقة.
ما هي المدمرات؟ هل يوجد مدمر في جافا؟
يتم استخدام أدوات التدمير لتحرير الذاكرة المكتسبة بواسطة البرنامج. على سبيل المثال، إذا كان برنامج ما يحتاج إلى ذاكرة أثناء تنفيذه، يقوم المدمر بتحرير تلك الذاكرة حتى تتمكن البرامج الأخرى من استخدامها. لا يوجد مفهوم للمدمر في Java لأن عمل تحرير الذاكرة في Java يتم التعامل معه بواسطة جامع البيانات المهملة.ما هو تسلسل المنشئ في جافا؟
عندما يتم استدعاء منشئ واحد من منشئ آخر، يمكن أن يسمى هذا تسلسل المنشئ. ليس من الضروري إجراء استدعاء المنشئ على نفس الفئة. ويمكن القيام بذلك للفئة الأم أيضًا. على سبيل المثال، النظر في الصورة أدناه. بعد ذلك، يمكننا إلقاء نظرة على التعليمات البرمجية لتهيئة الكائن بقيم قيم متغيرات الحالة هذه:class EmployeeAddess{
int pinCode;
String address;
String mobNo;
EmployeeAddress(int pinCode, String address, String mobNo){
this.pinCode = pinCodel
this.address = address;
this.mobNo = mobNo;
}
}
class Employees extends EmployeeAddress{
int ID;
String name;
String designation;
String department;
Employee(int ID, String name, String designation,String department,
int pinCode, String address, String mobNo){
//Calling Constructor for Base class to initialize the object.
//This can be a constructor chaining.
super(pinCode, address, mobNo);
this.ID = ID;
this.name = name;
this.designation = designation;
this.department = department;
}
}
public class Main{
Employee emp = new Employee(101, "XYX", "SDE", "Cloud", 123456, "no 150, xys, xys, INDIA", "999999999");
}
في الكود أعلاه، قمنا بإنشاء كائن فئة الموظف مع تفاصيل الموظف وعنوانه. يتم توريث فئة عنوان الموظف بواسطة فئة الموظف . الآن، لإنشاء قيمة كائن لعنوان ما، لا نقوم بتعيين قيمة صريحة لعنوان الموظف. بدلاً من ذلك، نستخدم مُنشئ فئة عنوان الموظف للقيام بذلك . وبمساعدة super(arguments) نقوم بتشكيل سلسلة من المنشئات لتهيئة القيم. هذا هو ما هي سلسلة البناء.
حدد مخرجات البرنامج من الكود واشرح إجابتك.
class InterviewBit{
void InterviewBit(){
System.out.println(" Java Constructor interview questions by InterviewBit");
}
int InterviewBit(int val){
System.out.println(" Java Constructor. And Value = "+val);
}
}
public class Main{
InterviewBit ib1 = new InterviewBit();
InterviewBit ib2 = new InterviewBit();
}
لن يطبع الكود أعلاه أي شيء لأن InterviewBit() ليس مُنشئًا هنا. نظرًا لاستخدام الكلمات الأساسية Void و int ، فإنها تصبح طريقة. لذلك نحن لا نسمي الطريقة. لن نحصل على أي مخرجات لأنه لتنفيذ الطريقة نحتاج إلى استدعائها بشكل صريح على الكائن.
اكتب برنامجًا لنسخ قيم كائن ما إلى كائن جديد باستخدام المُنشئ
class Rectangle{
int length;
int breadth;
Rectangle(int length, int breadth){
this.length = length;
this.breadth = breadth;
}
//Overloaded Constructor for copying the value of old Object to new object
Rectangle(Rectangle obj){
this.length = obj.length;
this.breadth = obj.breadth;
}
}
public class Main{
Rectangle obj1 = new Rectangle(10, 5);
//New Object of rectangle class will be created with the value from obj1.
Rectangle obj2 = new Rectangle(obj1);
}
GO TO FULL VERSION