CodeGym /مدونة جافا /Random-AR /استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java. ...
John Squirrels
مستوى
San Francisco

استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java. الجزء 4

نشرت في المجموعة
أهلا بالجميع! سأواصل اليوم مراجعتي لأسئلة مقابلة مطوري Java. استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 4 - 1

29. هل يمكن استخدام الإرجاع في المُنشئ؟

نعم، ولكن فقط بدون قيمة على يمين الكلمة الأساسية المرجعة . يمكنك استخدام العودة؛ كبيان مساعد في المُنشئ لإنهاء (مقاطعة) تنفيذ التعليمات البرمجية الإضافية بشكل عاجل وإنهاء تهيئة الكائن. على سبيل المثال، لنفترض أن لدينا فئة Cat ، وإذا كانت Cat بلا مأوى ( isHomeless = true ، فإننا نريد إنهاء التهيئة وعدم ملء الحقول الأخرى (بعد كل شيء، فهي غير معروفة لنا، نظرًا لأن القطة بلا مأوى) :

public Cat(int age, String name, boolean isHomeless) {
   if (isHomeless){
       this.isHomeless = isHomeless;
       return;
   }
   this.isHomeless = isHomeless;
   this.age = age;
   this.name = name;
}
ولكن إذا كنا نتحدث عن قيم محددة، فلن تتمكن الكلمة الأساسية return من إرجاع قيمة محددة للأسباب التالية:
  • عندما تعلن عن مُنشئ، فلن يكون لديك أي شيء مثل نوع الإرجاع؛
  • كقاعدة عامة، يتم استدعاء المنشئ ضمنيًا أثناء إنشاء مثيل؛
  • المنشئ ليس طريقة: إنه آلية منفصلة هدفها الوحيد هو تهيئة متغيرات الحالة، أي أننا نستخدم العامل الجديد لإنشاء كائن.
استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 4 - 2

30. هل يمكن طرح استثناء من المُنشئ؟

يعمل المنشئون مع الاستثناءات بنفس الطريقة التي تعمل بها الأساليب. تسمح لنا الأساليب بطرح الاستثناءات عن طريق كتابة الرميات <ExceptionType> في رأس الطريقة. ويسمح لنا المصممون بفعل الشيء نفسه. عندما نرث مُنشئ فئة فرعية ونحدده، يمكننا توسيع نوع الاستثناء - على سبيل المثال، IOException -> Exception (ولكن ليس العكس). دعونا نستخدم مُنشئ فئة Cat كمثال لمنشئ يرمي استثناءً. لنفترض أنه عندما نقوم بإنشاء كائن، نريد إدخال الاسم والعمر من وحدة التحكم:

public Cat() throws IOException {
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   this.name = reader.readLine();
   this.age = Integer.parseInt(reader.readLine());
}
نظرًا لأن Reader.readLine() ‎ يطرح IOException، فإننا نكتبه في الرأس كاستثناء محتمل.

31. ما هي عناصر رأس الفصل؟ اكتب مثالا

لتوضيح العناصر التي تشكل رأس الفصل، دعونا نلقي نظرة على مخطط صغير:
  • تظهر العناصر الإلزامية بين قوسين <>
  • العناصر الاختيارية موجودة في {}
{access modifier} {static} {final} {abstract <class name> {inheritance of Parent class} {implementation of Interfaces} إذًا، ما لدينا: { access modifier} — فقط معدّلات الوصول العامة والافتراضية متاحة لـ فصل. {static} - يشير المعدل الثابت إلى أن هذه الفئة ثابتة؛ فهو ينطبق فقط على الطبقات الداخلية (الفئات الموجودة داخل الفئات الأخرى). {final} — هذا هو المُعدِّل النهائي بالطبع، والذي يجعل الفئة غير قابلة للتوريث (مثال جاهز هو String ). {abstract} - المُعدِّل المجرد ، الذي يشير إلى أن الفصل قد يحتوي على أساليب غير مُنفذة. يتعارض هذا المعدل مع المعدل النهائي . يمكن أن يحتوي رأس الفئة على واحد فقط منها نظرًا لأن المُعدِّل المجرد يعني أن الفئة سيتم توريثها وسيتم تنفيذ عناصرها المجردة. لكن Final يشير إلى أن هذه هي النسخة النهائية للفئة، وأنه لا يمكن توريثها. في الواقع، سيكون استخدام كلا المعدلين في وقت واحد أمرًا سخيفًا. لن يسمح لنا المترجم بالقيام بذلك. <class> هي كلمة أساسية إلزامية تشير إلى إعلان الفئة. <اسم الفئة> هو اسم فئة بسيط يصبح معرف فئة Java معينة. يتكون اسم الفئة المؤهلة بالكامل من اسم الحزمة المؤهلة بالإضافة إلى "." بالإضافة إلى اسم الفصل البسيط. {inheritance of the Parent class} هو إشارة إلى الفئة الأصلية (إن وجدت) باستخدام الكلمة الأساسية الممتدة . على سبيل المثال، ... يمتد ParentClass . {تنفيذ الواجهات} — قائمة بالواجهات التي تنفذها هذه الفئة (إن وجدت)، باستخدام الكلمة الأساسية للتنفيذ . على سبيل المثال: ... تنفذ FirstInterface، SecondInterface ... كمثال، ضع في اعتبارك عنوان الفئة لفئة Lion ، التي ترث Cat وتنفذ واجهة WildAnimal :

public final class Lion extends Cat implements WildAnimal
استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 4 - 3

32. ما هي عناصر رأس الطريقة؟ اكتب مثالا

عند النظر في العناصر التي تشكل رأس الطريقة، دعونا نفكر مرة أخرى في مخطط صغير:
  • تظهر العناصر الإلزامية بين قوسين <>
  • العناصر الاختيارية موجودة في {}
{معدل الوصول} {static} {abstract} {final} {synchronized} {native} <return value><method name> <(>{method Parameters <}>{throw Exceptions} {access modifier} - جميع معدّلات الوصول متاح للطريقة - عامة ، محمية ، افتراضية ، خاصة . {static} - المعدل الثابت ، الذي يشير إلى أن الطريقة ثابتة وبالتالي مرتبطة بالفئة، وليس كائن. {abstract} - المعدل المجرد ، الذي يشير إلى أن لا تحتوي الطريقة على تطبيق (نص). للعمل بشكل صحيح، يجب أن تحتوي الفئة التي تعلن عن الطريقة أيضًا على معدل مجرد . كما هو الحال في رأس الفئة، يتعارض هذا المعدل مع المعدل النهائي ، ويتعارض أيضًا مع المعدل الثابت ، لأن تتضمن الطريقة المجردة تجاوز الطريقة في التابع، ولا يمكن تجاوز الطرق الثابتة. {finale} - المعدل النهائي ، مما يشير إلى أنه لا يمكن تجاوز هذه الطريقة. {synchronized} - المعدل المتزامن ، مما يعني أن الطريقة محمية من الوصول المتزامن إليها من مواضيع مختلفة. إذا لم تكن الطريقة ثابتة، فسيتم إغلاقها لكائن المزامنة هذا. إذا كانت الطريقة ثابتة، فسيتم إغلاقها لكائن المزامنة للفئة الحالية. {native} - يشير المعدل الأصلي إلى أن الطريقة مكتوبة بلغة برمجة أخرى. <نوع الإرجاع> — نوع القيمة التي يجب أن ترجعها الطريقة. إذا لم تُرجع الطريقة أي شيء، فسيتم إلغاؤها . <اسم الطريقة> — اسم اسم الطريقة، أي معرفها في النظام. {معلمات الطريقة} — المعلمات التي تقبلها الطريقة: وهي ضرورية لتنفيذ وظائفها. {رمي الاستثناءات}يطرح <ExceptionType> — قائمة بالاستثناءات المحددة التي يمكن لهذه الطريقة طرحها. سأقدم ما يلي كمثال لرأس الطريقة:

public static void main(String[] args) throws IOException

33. قم بإنشاء مُنشئ افتراضي في فئة فرعية إذا لم يتم تعريفه بالفعل في الفئة الأساسية (ولكن تم تعريف مُنشئ مختلف)

لست متأكدًا من أنني أفهم السؤال تمامًا، ولكن ربما يعني ذلك أن لدينا مُنشئًا مثل هذا في الفصل الأصلي:

public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
في هذه الحالة، في الفئة الأصل، نحتاج بالتأكيد إلى تعريف المُنشئ الذي سيقوم بتهيئة الوالد (أي استدعاء المُنشئ الأصلي):

public class Lion extends Cat {
 
   public Lion(int age, String name) {
       super(age, name);
   }
}
استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 4 - 4

34. متى يتم استخدام هذه الكلمة الأساسية؟

في جافا، هذا له معنيان مختلفان. 1. إنها إشارة إلى الكائن الحالي، على سبيل المثال this.age = 9 . أي أن هذا يشير إلى الكائن الذي يتم استخدامه فيه والذي يشير إليه الكود الذي يحمل هذا . الغرض الرئيسي هو تحسين إمكانية قراءة التعليمات البرمجية وتجنب الغموض. على سبيل المثال، إذا كان حقل المثيل ووسيطة الطريقة لهما نفس الاسم:

public void setName(String name) {
   this.name = name;
}
أي أن this.name هو حقل الكائن، بينما name هو معلمة الطريقة. لا يمكن استخدام هذا المرجع في الأساليب الثابتة . 2. في المنشئ، يمكن استدعاء هذا كطريقة، على سبيل المثال this(value) . في هذه الحالة، سيتم استدعاء منشئ آخر من نفس الفئة. في الأساس، يمكنك استدعاء مُنشئين أثناء عملية إنشاء الكائن:

public Cat(int age, String name) {
   this(name);
   this.age = age;
}
 
public Cat(String name) {
   this.name = name;
}
عند استدعاء المنشئ الأول لإنشاء كائن Cat ، ستتم تهيئة حقلي المثيلين بنجاح. هناك بعض الفروق الدقيقة هنا:
  1. this() يعمل فقط في المنشئ.
  2. يجب أن تكون الإشارة إلى مُنشئ آخر في السطر الأول من كتلة المُنشئ (النص). هذا يعني أن المُنشئ لا يمكنه استدعاء أكثر من مُنشئ (آخر) من فئته.
استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 4 - 5

35. ما هو المُهيئ؟

بقدر ما أفهم، هذا السؤال يتعلق بكتل التهيئة العادية والثابتة. دعونا نتذكر أولاً ما هي التهيئة. التهيئة هي إنشاء الحقول وتنشيطها وإعدادها وتعريفها. تحضير البرنامج أو المكون ليكون جاهزاً للاستخدام. سوف تتذكر أنه عندما تقوم بإنشاء كائن، يمكن تهيئة متغير الفئة فورًا عندما يتم الإعلان عنه:

class Cat {
   private int age = 9;
   private String name = "Tom";
أو تعيين بعد الحقيقة من خلال المنشئ:

class Cat {
   private int age;
   private String name;
 
   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }
ولكن هناك طريقة أخرى: يمكنك تعيين متغير مثيل باستخدام كتلة التهيئة، والتي تأخذ شكل الأقواس المتعرجة {} داخل فئة، بدون اسم (مثل طريقة بدون اسم أو مُنشئ):

class Cat {
   private int age;
   private String name;
 
   {
       age = 10;
       name = "Tom";
   }
كتلة التهيئة هي جزء من التعليمات البرمجية التي يتم تحميلها عند إنشاء كائن. تُستخدم هذه الكتل عادةً لإجراء بعض العمليات الحسابية المعقدة المطلوبة عند تحميل الفصل. يمكن تعيين نتائج هذه الحسابات كقيم للمتغيرات. بالإضافة إلى كتل التهيئة العادية، هناك كتل ثابتة. تبدو متشابهة ولكنها تحتوي على الكلمة الأساسية الثابتة أمام قوس الفتح المتعرج:

class Cat {
   private static int age;
   private static String name;
 
   static{
       age = 10;
       name = "Tom";
   }
هذه الكتلة هي نفس الكتلة السابقة. ولكن إذا تم تنفيذ الكائن العادي عند تهيئة كل كائن، فسيتم تنفيذ الكائن الثابت مرة واحدة فقط عند تحميل الفصل. كقاعدة عامة، يتم إجراء بعض الحسابات المعقدة في كتلة ثابتة، تُستخدم لتهيئة متغيرات الفئة الثابتة. تنطبق نفس القيود على الكتلة الثابتة التي تنطبق على الأساليب الثابتة: لا يمكنك استخدام بيانات غير ثابتة، مثل الإشارة إلى الكائن الحالي ( this ) في كتلة ثابتة. استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 4 - 6يمكننا الآن إلقاء نظرة على ترتيب تهيئة الفصل (مع فئته الأصلية) من أجل فهم أفضل للوقت الذي يتم فيه استدعاء كتل التهيئة بالضبط.

36. في حالة وجود فئة فرعية عامة تمتد إلى الأصل، اكتب ترتيب تهيئة الكائن

عند تحميل فئة الطفل ، سيكون ترتيب التهيئة كما يلي:
  1. حقول الفئة الثابتة للفئة الأصل .
  2. كتلة التهيئة الثابتة للفئة الأصل .
  3. الحقول الثابتة لفئة الطفل .
  4. كتلة التهيئة الثابتة لفئة الطفل .
  5. الحقول غير الثابتة للفئة الأصل .
  6. كتلة التهيئة غير الثابتة للفئة الأصل .
  7. منشئ فئة الوالدين .
  8. الحقول غير الثابتة لفئة الطفل .
  9. كتلة التهيئة غير الثابتة لفئة الطفل .
  10. منشئ فئة الطفل .
استكشاف الأسئلة والأجوبة من مقابلة عمل لوظيفة مطور Java.  الجزء 4 - 7

37. ما نوع العلاقات بين الفئات (الأشياء) التي تعرفها؟

هناك نوعان من المتغيرات في Java: الأنواع البدائية والمراجع إلى الكائنات الكاملة.
  • العلاقات IS-A
يعتمد مبدأ IS-A الخاص بـ OOP على وراثة الفئة أو تنفيذ الواجهات. على سبيل المثال، إذا ورثت فئة Lion القطة ، فإننا نقول أن Lion هو قطة :

Lion IS-A Cat
(ولكن ليس كل قطة هي أسد ) نفس الوضع موجود مع الواجهات. إذا كانت فئة Lion تطبق واجهة WildAnimal ، فهي موجودة أيضًا في العلاقة:

Lion IS-A WildAnimal
  • لديه علاقة
هذا النوع من العلاقات هو حيث يستخدم أحد الفئات فئات أخرى، ويسمى أيضًا "الارتباط". الارتباط هو فئة واحدة تشير إلى فئة أخرى (أو إشارات متبادلة لبعضها البعض). على سبيل المثال، يمكن أن تشير فئة السيارة إلى فئة الركاب ، والتي قد تشكل العلاقة التالية:

Car HAS-A Passenger
والعكس صحيح: إذا كان لدى الراكب إشارة إلى السيارة ، فستكون هذه العلاقة:

Passenger HAS-A Car

38. ما هي العلاقات الترابطية التي تعرفها؟

التجميع والتكوين ليسا أكثر من حالات خاصة من الارتباط. التجميع هو علاقة يكون فيها كائن جزءًا من كائن آخر. على سبيل المثال، قد يكون أحد الركاب موجودًا في السيارة. علاوة على ذلك، قد يكون هناك العديد من الركاب أو لا يوجد أي ركاب على الإطلاق (وإذا كنا نتحدث عن تسلا، فقد لا يكون هناك سائق). على سبيل المثال:

public class Car {
   private List passengers = new ArrayList<>();
 
 void setPassenger(Passenger passenger) {
     passengers.add(passenger);
 }
 
   void move() {
       for (Passenger passenger : passengers) {
           System.out.println("Transporting passenger - " + passenger.toString());
       }
       passengers.clear();
   }
}
بمعنى آخر، عدد الركاب (في أي منها) ليس مهمًا بالنسبة لنا: وظائف فئة السيارة لا تعتمد على هذا. يشير التجميع أيضًا إلى أنه عندما يستخدم كائن آخر كائنًا واحدًا، يمكن استخدام الكائن الأول بواسطة كائنات أخرى. على سبيل المثال، قد يكون نفس الطالب عضوًا في نادي الحياكة وفرقة الروك ويحضر في نفس الوقت فصل اللغة الإسبانية. كما يمكنك أن تتخيل، التجميع هو علاقة ترابطية أكثر مرونة بين الطبقات. إن التركيب هو علاقة أكثر إحكاما حيث لا يكون الكائن مجرد جزء من كائن آخر، ولكن عمل كائن ما يعتمد بشكل كبير على كائن آخر. على سبيل المثال، السيارة لديها محرك. قد يوجد المحرك بدون سيارة، لكنه لا فائدة منه خارج السيارة. ولا يمكن للسيارة أن تعمل بدون محرك:

public class Car {
   private Engine engine;
 
   public Car(Engine engine) {
       this.engine = engine;
   }
 
   void startMoving() {
       engine.start();
           ...
   }
يشير التركيب أيضًا إلى أنه عندما يستخدم كائن آخر كائنًا، فإن الكائن الأول لا يمكن أن ينتمي إلى أي كائن آخر. وبالعودة إلى مثالنا، يمكن أن ينتمي المحرك لسيارة واحدة فقط، وليس لسيارتين أو أكثر في نفس الوقت. أعتقد أن هذا يكفي لهذا اليوم، لذلك سنتوقف هنا.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION