JavaRush /مدونة جافا /Random-AR /تحليل الأسئلة والأجوبة من المقابلات لمطور جافا. الجزء 4

تحليل الأسئلة والأجوبة من المقابلات لمطور جافا. الجزء 4

نشرت في المجموعة
مرحبًا بالجميع، سأواصل اليوم تحليل أكثر من 250 سؤالًا لمقابلة مطور Java. تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 4 - 1الأجزاء السابقة من التحليل: الأول ، الثاني ، الثالث . لذلك دعونا نستمر.

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

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

عند الحديث عن العناصر التي تشكل رأس الفصل، دعونا نلقي نظرة على رسم تخطيطي صغير:
  • المكونات الإلزامية ستكون بين قوسين <>
  • اختياري - في {}
{معدل الوصول إلى الفصل الدراسي} {ثبات الفصل} {نهائية الفصل} {تجريد الفصل} <اسم الفئة>{الميراث من فئة الأصل} {تنفيذ الواجهة} لذا، ما لدينا: {class access modifier} - فقط المعدلات العامة ومعدلات الوصول المفقودة، أي الافتراضي، متاحة للفئة . {class static} - static هو مُعدِّل يشير إلى أن هذه الفئة ثابتة، ولا تنطبق إلا على الفئات الداخلية (الفئات الموجودة داخل الفئات الأخرى). {نهائية الفئة} - كما نتذكر، هذا هو المعدل النهائي ، الذي في وجوده تصبح الفئة غير قابلة للتوريث (مثال من المربع - سلسلة ). {class Abstraction} - modifier - Abstract ، مما يشير إلى أن هذه الفئة قد تحتوي على أساليب غير منفذة. يتعارض هذا المعدل مع المعدل النهائي ، أي أنه يمكن أن يكون واحدًا منهم فقط في رأس الفصل، نظرًا لأن المعدل المجرد يعني أن الفئة المحددة سيتم توريثها وسيتم تنفيذ أجزائها المجردة. ويشير Final إلى أن هذه هي النسخة النهائية (النهائية) للفئة، ولا يمكن توريثها. في الواقع، استخدام كلا المعدلين في نفس الوقت سيكون أمرًا سخيفًا، ولن يسمح لنا المترجم بالقيام بذلك. <class> هي كلمة أساسية مطلوبة تشير إلى إعلان الفئة. <اسم الفئة> هو اسم فئة بسيط، وهو معرف فئة Java محددة. يتكون اسم الفئة المؤهلة بالكامل من اسم الحزمة المؤهلة بالكامل + . + اسم فئة بسيط. {الميراث من فئة الأصل} - تحديد الفئة الأصلية (إن وجدت) باستخدام الكلمة الأساسية الممتدة . على سبيل المثال، .. يمتد ParentClass . {تنفيذ الواجهة} - تحديد الواجهات التي تنفذها هذه الفئة (إن وجدت) باستخدام الكلمة الأساسية المنفذة . على سبيل المثال: ... تنفذ FirstInterface وSecondInterface ... حسنًا، كمثال لرأس الفئة، فكر في رأس فئة Lion ، التي ترث من Cat وتنفذ واجهة WildAnimal :
public final class Lion extends Cat implements WildAnimal
تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 4 - 3

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

مرة أخرى، عند النظر إلى العناصر التي تشكل رأس الطريقة، فكر في رسم تخطيطي صغير حيث:
  • المكونات الإلزامية بين قوسين <>
  • اختياري - في {}
{معدل الوصول} {method static} {method Abstraction} {method Finality} {synchronization modifier} {native modifier <return value><method name> <(> {method medias} <)> {thrown Exceptions} {access modifier } - جميع معدّلات الوصول متاحة للطريقة: public ، protected ، default ، و private . {method static} - static هو مُعدِّل يشير إلى أن هذه الطريقة ثابتة، أي أنها مرتبطة ليس بكائن، بل بفئة ما. {method Abstraction} هو مُعدل مجردة ، مما يشير إلى عدم وجود تطبيق (نص) للطريقة. للتشغيل الصحيح، تحتاج أيضًا إلى مُعدِّل تجريدي للفئة التي يتم توفير الطريقة فيها. كما هو الحال في رأس الفئة، يتعارض هذا المعدل مع المعدل النهائي ، ولكن بالإضافة إليه، فإنه يتعارض أيضًا مع المعدل الثابت ، لأن تتضمن الطريقة المجردة تجاوز الطريقة الموجودة في التابع، ولا يتم تجاوز الطرق الثابتة. {نهائية الطريقة} - نهائية - مُعدِّل يشير إلى أنه لا يمكن تجاوز هذه الطريقة. {معدل المزامنة} - متزامن - معدّل يعني أن هذه الطريقة محمية من الوصول المتزامن إليها من سلاسل رسائل مختلفة. إذا لم تكن الطريقة ثابتة، فسيتم إغلاقها على كائن المزامنة هذا. إذا كانت الطريقة ثابتة، فسيتم إغلاقها على كائن المزامنة للفئة الحالية. {native modifier} - أصلي - يشير هذا المعدل إلى أن الطريقة مكتوبة بلغة برمجة مختلفة. <return value> هو نوع القيمة التي يجب أن ترجعها الطريقة. إذا لم يجب أن يعود أي شيء، باطلا . <اسم الطريقة> هو اسم الطريقة، ومعرفها في النظام. {وسائط الطريقة} هي الوسائط (المعلمات) التي تأخذها الطريقة: وهي ضرورية لتنفيذ وظائفها. {الاستثناءات القابلة للرمي} - throwsExceptionType - قائمة بالاستثناءات المحددة التي يمكن لهذه الطريقة طرحها. وكمثال على رأس الطريقة، سأعطي هذا:
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);
   }
}
تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 4 - 4

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

في جافا، هذا له معنيان مختلفان. 1. كمرجع للكائن الحالي، مثل this.age = 9 . أي أن هذا يشير إلى الكائن الذي تم استدعاؤه عليه والذي يشير إليه الكود الذي يستخدم this . وتتمثل المهمة الرئيسية في زيادة إمكانية قراءة التعليمات البرمجية وتجنب الغموض. على سبيل المثال، إذا كان اسم حقل الفئة الداخلية ووسيطة الطريقة متماثلين:
public void setName(String 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. يجب أن تكون الإشارة إلى مُنشئ آخر في السطر الأول من كتلة المُنشئ (النص). لذلك، لا يمكن استدعاء أكثر من مُنشئ (آخر) لفئة معينة في مُنشئ واحد.
تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 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";
   }
هذه الكتلة هي بالضبط نفس الكتلة السابقة. ولكن إذا تم تشغيل الكائن العادي عند تهيئة كل كائن، فسيتم تشغيل الكائن الثابت مرة واحدة فقط، عند تحميل الفصل. في مثل هذه الكتلة، كقاعدة عامة، يتم أيضًا إجراء بعض الحسابات المعقدة للتهيئة اللاحقة لمتغيرات الفئة الثابتة. تنطبق نفس القيود على الكتلة الثابتة كما هو الحال مع الأساليب الثابتة: لا يمكنها استخدام بيانات غير ثابتة، بالإضافة إلى مرجع إلى الكائن الحالي - هذا . تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 4 - 6بعد ذلك، يمكننا رؤية ترتيب تهيئة الفصل (مع سلفه) لفهم أفضل للحظة التي يتم فيها تشغيل كتل التهيئة.

36. لوراثة فئة عامة، يمتد الطفل إلى الوالدين، اكتب ترتيب تهيئة الكائن

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

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

هناك نوعان من العلاقات بين الفئات في Java:
  • علاقة IS-A
يعتمد مبدأ IS-A في OOP على وراثة الفئة أو تنفيذ الواجهة. على سبيل المثال، إذا ورثت فئة Lion من Cat ، نقول أن Lion هو Cat :
Lion IS-A Cat
(ولكن ليس كل قطة هي أسد ) الوضع هو نفسه تمامًا مع الواجهات. إذا كانت فئة Lion تطبق واجهة WildAnimal ، فهي أيضًا على علاقة:
Lion IS-A WildAnimal
  • علاقات HAS-A
يعتمد هذا النوع من العلاقات على استخدام الفئات من قبل فئات أخرى، ويسمى أيضًا "الارتباط". الارتباط هو فئة واحدة تشير إلى فئة أخرى (أو حتى بعضها البعض). على سبيل المثال، يمكن أن تشير فئة السيارة إلى فئة الركاب ، وستكون هذه هي العلاقة:
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("Перевозка пассажира - " + passenger.toString());
       }
       passengers.clear();
   }
}
أي أننا لا نهتم بعدد الركاب (أو ما إذا كان هناك أي ركاب على الإطلاق): لا تعتمد وظيفة فئة السيارة على هذا. يشير التجميع أيضًا إلى أنه عند استخدام كائن بواسطة كائن آخر، يمكن استخدام الكائن الأول في كائنات أخرى. على سبيل المثال، يمكن للطالب نفسه أن يكون عضوًا في نادي الحياكة وفي مجموعة موسيقى الروك، وفي نفس الوقت يذهب إلى مجموعة من متعلمي اللغة الإنجليزية. كما تفهم، التجميع هو علاقة ترابطية أكثر مرونة بين الطبقات. تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 4 - 8يعتبر التركيب علاقة أكثر صرامة عندما لا يكون الكائن مجرد جزء من كائن آخر، ولكن عمل الكائن الآخر يعتمد بشكل كبير على الأول. على سبيل المثال، محرك السيارة. ورغم أن المحرك قد يوجد بدون السيارة، إلا أنه لا فائدة منه خارجها. حسنًا، لا يمكن للسيارة أن تعمل بدون محرك:
public class Car {
   private Engine engine;

   public Car(Engine engine) {
       this.engine = engine;
   }

   void startMoving() {
       engine.start();
           ...
   }
يشير التركيب أيضًا إلى أنه عند استخدام كائن ما بواسطة كائن آخر، فإن الأول لا يمكن أن ينتمي إلى شخص آخر. إذا عدنا إلى مثالنا، يمكن أن ينتمي المحرك لسيارة واحدة فقط، ولكن ليس لسيارتين أو أكثر في نفس الوقت. ربما سنتوقف هنا اليوم.تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 4 - 9
مواد أخرى في السلسلة:
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION