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

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

نشرت في المجموعة
أهلا أهلا! اليوم، هناك طلب كبير على مطوري Java. بالطبع، لا أستطيع أن أقدم لك وظيفة شاغرة، لكنني سأحاول مساعدتك في اكتساب معرفة جديدة وسد بعض الثغرات. لذلك نواصل تحليل أكثر من 250 سؤالًا للمقابلة لمطوري Java. روابط للأجزاء السابقة من التحليل موجودة في نهاية المقال.تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 1

39. ما هي معدلات الوصول في جافا؟ سميهم. ما يتم استخدامها ل؟

لقد سبق أن وصفت معدّلات الوصول في السؤال حول عناصر تغليف Java. لكنني سأذكرك على أي حال. معدّلات الوصول في Java هي كلمات أساسية تصف مستوى الوصول الممنوح لمكون Java معين. يمكن أن تكون معدّلات الوصول:
  • عام - سيكون العنصر الذي يحتوي على هذا المُعدِّل متاحًا للعامة. أولئك. الحقول والأساليب، والفئات المعلنة باستخدام المعدل العام تكون مرئية للفئات الأخرى سواء من الحزمة الحالية أو من الحزم الخارجية؛
  • محمي - يمكن الوصول إلى العنصر الذي يحتوي على هذا المُعدِّل من أي مكان في الفئة الحالية للحزمة الحالية أو في الفئات التابعة، حتى لو كانت موجودة في حزم أخرى؛
  • المُعدِّل الافتراضي أو المفقود - يُستخدم هذا المُعدِّل ضمنيًا عندما لا يتم تحديد مُعدِّل الوصول على الإطلاق. إنه مشابه للسابق، فيما عدا أن الرؤية مسموح بها في الفئات التابعة الموجودة في الحزم الأخرى؛
  • الخاص هو الأكثر خصوصية بين جميع المعدلات، مما يسمح بالوصول إلى العنصر داخل الفئة الحالية فقط.
تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 2

40. اذكر السمة الرئيسية للطرق الثابتة والمتغيرة

صيغة غريبة جدًا - "الطرق المتغيرة". بالتأكيد يشير هذا إلى الأساليب العادية وغير الثابتة. لذا، فإن الاختلاف الرئيسي هو أن الأساليب الثابتة تنتمي إلى الفصل، وفي الواقع، لا تحتاج إلى إنشاء مثيل لهذه الفئة: لا يمكن استدعاؤها إلا باستخدام نوع الفئة. على سبيل المثال، لدينا طريقة ثابتة لمداعبة القطة:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
لا نحتاج إلى مثيل لفئة CatService لنسميها :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
في حين أن الطرق العادية مرتبطة (تنتمي إلى) كائن ما، ومن أجل استدعائها، يجب أن يكون لديك مثيل (كائن) سيتم استدعاء الطريقة عليه. على سبيل المثال، القطة لديها طريقة غير ثابتة - المواء:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
لاستدعاء هذه الطريقة، نحتاج إلى نسخة محددة من القطة:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. ما هي القيود الرئيسية على الأساليب الثابتة و"المتغيرة"؟

كما قلت سابقًا، القيد الرئيسي للطريقة العادية هو أنه يجب أن يكون هناك دائمًا بعض المثيلات التي سيتم استدعاء الطريقة عليها. لكن الطريقة الثابتة لا تتطلب ذلك، لكن لا يمكنها الرجوع إلى هذا المرجع - إلى عناصر الكائن الحالي - حيث أن الكائن الحالي غير موجود له.

42. ماذا تعني الكلمة الأساسية الثابتة؟ هل يمكن تجاوز الطريقة الثابتة أو تحميلها بشكل زائد؟

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

43. هل يمكن أن تكون الطريقة ثابتة ومجردة في نفس الوقت؟

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

44. هل من الممكن استخدام الطرق الساكنة وسط الطرق العادية؟ والعكس صحيح؟ لماذا؟

يمكن استخدام الأساليب الثابتة في الطرق العادية، لأنه لا يوجد شيء يمنع ذلك. في الوقت نفسه، الوضع العكسي مستحيل: لا يمكن للطريقة الثابتة استخدام طريقة عادية دون الإشارة إلى مثيل معين من هذه الفئة. وكما نتذكر، فإن هذا المرجع غير متاح لأعضاء الفئة الثابتة: يمكن أن يكون هناك العديد من الكائنات المحددة للفئة كما تريد، وسيكون لكل منهم مرجع لنفسه بالداخل - this . وكيف تفهم إذن ما هو هذا الرابط الذي يجب عليك اتخاذه؟ ولكن بأي حال من الأحوال. ولذلك، لا يمكن للعناصر الثابتة أن تشير إلى عناصر غير ثابتة، دون الإشارة إلى كائن معين. في الواقع، يمكن للطريقة الثابتة استخدام طريقة غير ثابتة فقط إذا كانت تحتوي على مرجع إلى كائن معين. على سبيل المثال، الذي جاء كحجة:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
نرى هنا أن الطريقة الثابتة petTheCat تستدعي الطريقة العادية وغير الثابتة لكائن Cat - getName .

45. ما هي الواجهة؟ هل يمكن أن تكون هناك واجهة نهائية؟

كما نتذكر، لا يوجد وراثة متعددة في جافا. الواجهات هي شيء بديل لها. تبدو الواجهة وكأنها فئة مجردة للغاية. وهي تحدد الوظيفة دون تنفيذ محدد، والذي يتم تنفيذه بواسطة الفئات التي تنفذ (تنفذ) هذه الواجهات. مثال الواجهة:
public interface Animal {
    void voice();
}
مثال على تنفيذ الواجهة بواسطة فئة:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
الشيء الرئيسي الذي تحتاج إلى معرفته حول استخدام الواجهات هو:
  1. يجب أن تحتوي أساليب الواجهة على رأس فقط، دون نص أسلوب محدد، على سبيل المثال. يجب أن تكون مجردة (ولكن دون استخدام الكلمة الأساسية المجردة ). الاستثناء لهذا هو الأساليب الثابتة والافتراضية، والتي تتطلب نص أسلوب.
  2. يمكن للفصل تنفيذ العديد من الواجهات (كما قلت، هذا بديل للميراث المتعدد)، والتي يتم كتابتها مفصولة بفواصل: يقوم الفصل Lion بتنفيذ Animal، Wild .
  3. يتم إنشاء الواجهات باستخدام الكلمة الأساسية - الواجهة .
  4. عند تنفيذ واجهة بواسطة فئة ما، تكون الكلمة الأساسية هي Implements .
  5. يجب على الفئة التي تنفذ واجهة معينة أن تنفذ جميع أساليبها المجردة، أو يجب أن تعلن عن نفسها مجردة.
  6. الغرض الرئيسي من استخدام الواجهات هو تنفيذ تعدد الأشكال (قدرة الكائنات على اتخاذ أشكال عديدة).
  7. كقاعدة عامة، لا تتم كتابة معدّلات الوصول للطرق في الواجهة: فهي عامة بشكل افتراضي، ولا يمكن تحديد معدّلات أخرى غير العامة . منذ Java 9، يمكنك استخدام المعدلات الخاصة للطرق.
  8. متغيرات الواجهة هي متغيرات نهائية افتراضيًا ، بمعنى آخر، ثوابت: يجب دائمًا تهيئتها مباشرةً في الواجهة.
  9. لا يمكنك إنشاء كائن واجهة.
الإجابة على سؤال ما إذا كانت الواجهات يمكن أن تكون نهائية هي بالطبع لا. بعد كل شيء، جوهر الواجهات هو أن يتم تنفيذها. وكما نتذكر جميعًا جيدًا، فإن النهائي على مستوى الفصل يجعله غير قابل للتوريث، وفي حالة الواجهة، غير قابل للتنفيذ. لماذا نحتاج إلى واجهة لا يمكن تنفيذها واستخدامها؟ هذا صحيح - ليست هناك حاجة! والمترجم يعتقد ذلك)) تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 4لم يظهر المعنى إلا مع إدخال الأساليب الثابتة في الواجهات مع Java 8، لكن هذا لم يغير حقيقة أن الواجهة لا يمكن أن تكون نهائية. لقد تحدثت عن الواجهات بشكل سطحي للغاية، لأن... هذا موضوع واسع. اقرأ المزيد عن هذا في المقالات حول الواجهات في Java والفرق بين الفئات المجردة والواجهات .

46. ​​أين يمكنني تهيئة الحقول الثابتة؟

يمكن تهيئة الحقول الثابتة:
  • مباشرة عند الإعلان، من خلال علامة المساواة = ;
  • في كتلة التهيئة الثابتة؛
  • في كتلة تهيئة غير ثابتة، ولكن يجب أن تفهم أنه في كل مرة يتم فيها إنشاء كائن، سيتم الكتابة فوق هذا الحقل بواسطة كتلة التهيئة هذه؛
  • في منشئ الصف. في كل مرة يتم فيها استدعاء هذا المنشئ (أي عند إنشاء كائن من خلال هذا المنشئ)، ستتم الكتابة فوق هذا الحقل؛
  • في الأساليب الثابتة.
  • وبطرق غير ثابتة؛
  • في الطبقات الداخلية الثابتة وغير الثابتة والمحلية والمجهولة.

47. ما هي الطبقات المجهولة؟

الفئات المجهولة هي فئات ليس لها نوعها الخاص. ما الذي أتحدث عنه؟ عندما تحدثنا عن الواجهات، ذكرت أنه لا يمكنك إنشاء كائن واجهة: يمكنك فقط إنشاء كائن من فئة تقوم بتنفيذ الواجهة. ماذا لو كنت لا ترغب في تنفيذ واجهة في الفصل الدراسي، ولكنك لا تزال بحاجة إلى كائن من نوع الواجهة؟ وعلى الأرجح، ستكون هذه حالة واحدة لاستخدام هذا الكائن. ولا تحتاج إلى إنشاء فئة تنفيذ كاملة. كيف ستفعل هذا؟ يمين! من خلال فئة مجهولة! تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 5لنفترض أن لدينا بعض واجهة الحيوان :
public final interface Animal {
   public void voice();
}
إذا أردنا إنشاء مثيل لهذه الواجهة من خلال فئة مجهولة:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
وبعد ذلك يمكنك استخدام هذا الكائن وطريقته المنفذة بأمان - الصوت . أي أن فئة مجهولة تنفذ هذه الواجهة وجميع أساليبها المجردة هنا والآن. وإلا فلن نتمكن من إنشاء كائن فئة واجهة/ملخص، نظرًا لوجود طرق غير منفذة/مجردة. كما ذكرت، يتم استخدام الفئات المجهولة ليس فقط لتنفيذ الأساليب المجردة للواجهة، ولكن أيضًا لتنفيذ الأساليب المجردة لفئة مجردة. يعد هذا الأسلوب مفيدًا في المواقف التي يتم فيها استخدام كائن لمرة واحدة أو عندما تكون هناك حاجة إلى تنفيذ معين للطرق مرة واحدة فقط، وليست هناك حاجة لإنشاء فئة منفصلة تنفذ الفئة/الواجهة المجردة المطلوبة. ولكنني سأشير أيضًا إلى أن استخدام الفئات المجهولة أمر نادر الحدوث في العمل: كقاعدة عامة، لا تزال الأفضلية تُعطى للفصول العادية. يمكنك قراءة المزيد عن الفئات المجهولة في هذه المقالة .

48. ما هي الطبقات البدائية؟

بالنسبة لي، هذا سؤال غريب جدًا، وربما يكون هذا سؤال فخ، لأنه في Java لا يوجد شيء مثل الفئات البدائية: ربما باستثناء مفهوم الأنواع البدائية، الذي سبق أن تناولناه سابقًا. كما نتذكر، هناك 8 أنواع بدائية في Java - byte ، short ، int ، long ، float ، double ، char ، boolean .تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 6

49. ما هي فئة "المجمع"؟

المشكلة الرئيسية في استخدام الأنواع البدائية في Java هي أنها لا تزال غير فئات، ولا تزال Java لغة OOP. أي أن البرامج المكتوبة بهذه اللغة تقتصر على التفاعل بين الكائنات. حسنًا، البدائيون ليسوا كائنات. ليس لديهم أساليب، ولا حتى الأساليب القياسية من فئة الكائن . حسنًا، ماذا لو أردنا استخدام عنصر بدائي كمفتاح في الخريطة ؟ فأنت بحاجة إلى استدعاء طريقة hashCode . يمكنك أيضًا استدعاء طريقة التساوي هناك . ماذا بعد؟ يمكن أن تكون هناك لحظات كثيرة جدًا حيث يجب أن يكون هناك فئة، وليس بدائية، مما يجعل العناصر الأولية غير مستخدمة وغير مرغوب فيها في البرنامج، لأن هذا يدمر فكرة OOP ذاتها. ولكن ليس كل شيء سيئًا كما يبدو. بعد كل شيء، جافا لديها مفهوم المجمع البدائي. يحتوي كل نوع بدائي على فئة تناظرية:
  • بايت -> بايت.فئة
  • قصيرة -> Short.class
  • إنت -> Integer.class
  • طويل -> طويل
  • تعويم -> Float.class
  • مزدوج -> Double.class
  • شار- > حرف.فئة
  • منطقية -> Boolean.class
هذا تمثيل لأنواع بسيطة، ولكن في شكل فصول كاملة مع مجموعة من الأساليب المتنوعة والوظيفية. للاستخدام المريح لهذه الفئات، تم تقديم مفاهيم Autoboxing و Unboxing. Autoboxing - التحويل التلقائي للنوع البدائي إلى فئة تماثلية إذا لزم الأمر (على سبيل المثال، int إلى Integer ). Unboxing هي العملية العكسية للعملية السابقة: تحويل فئة الغلاف البدائية تلقائيًا إلى نوع بدائي (على سبيل المثال، Integer إلى int ). بفضل تقديم فئات الغلاف البدائية وعمليات التشغيل الآلي والفتح ، تمكنت الأنواع البدائية من أن تصبح أعضاء كاملين في لغة OOP - Java. لمعرفة المزيد حول هذا الموضوع، أوصي بشدة بقراءة هذا المقال .تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 7

50. ما هي الطبقة المتداخلة؟ متى يتم استخدامه؟

الفئة المتداخلة هي فئة داخلية عضو في فئة أخرى. في Java، هناك 4 أنواع من هذه الفئات الداخلية: 1. الفئة الداخلية يتم الإعلان عن هذا النوع من الفئات مباشرة في نص فئة أخرى. يمكن للفئة الداخلية المتداخلة الوصول إلى أي حقل خاص أو طريقة لمثيل الفئة الخارجية. على سبيل المثال، لنقم بإنشاء حديقة حيوانات سيكون لدينا فيها حيوان - حمار وحشي:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
لا شيء معقد، أليس كذلك؟ دعونا نلقي نظرة على مثال لإنشاء كائن فئة داخلية:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
كما رأيت بالفعل، من الضروري إنشاء كائن من فئة الإطارات، بناءً على المرجع الذي يمكنك من خلاله إنشاء كائن من الفئة الداخلية. أود أيضًا أن أشير إلى أن الفئة الداخلية المتداخلة لا يمكن أن تحتوي على أساليب ثابتة أو حقول ثابتة. وذلك لأن الفئة الداخلية ترتبط ضمنيًا بكائن فئتها الخارجية ولا يمكنها الإعلان عن أي طرق ثابتة داخل نفسها. 2. الفئات المتداخلة الثابتة هذه الفئة تشبه الفئة السابقة، ولكنها تحتوي فقط على معدل وصول ثابت بالقرب من إعلان الفئة. نظرًا لأن هذا النوع من الفئات لا يمكنه الوصول إلى الحقول غير الثابتة للفئة الخارجية، فهو يشبه الجزء الثابت من الطبقة الخارجية أكثر من الطبقة الداخلية. في هذه الحالة، تتمتع بيانات الفصل بإمكانية الوصول إلى جميع الأعضاء الثابتين في الفصل الخارجي، حتى الأعضاء الخاصين. مثال على فئة متداخلة ثابتة:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
تختلف طريقة الإنشاء قليلاً عن الطريقة السابقة:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
لا نحتاج هنا إلى كائن من فئة خارجية لإنشاء كائن من فئة ثابتة متداخلة. من الطبقة الخارجية، نحتاج فقط إلى نوعها حتى نتمكن من العثور على موقع الطبقة المتداخلة. 3. الفئات المحلية الفئات المحلية هي فئات تم الإعلان عنها داخل نص الطريقة، ويمكن إنشاء واستخدام كائن فئة محلية حصريًا ضمن هذه الطريقة. مثال:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
مثال الاستخدام:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
بدون رؤية رمز طريقة toFeed ، لن تشك حتى في وجود فئة محلية، أليس كذلك؟ لا يمكن للفئة المحلية أن تكون ثابتة أو عابرة ، ولكن يمكن تمييزها على أنها مجردة أو نهائية (فقط OR، لأن استخدام هذين المعدلين سيؤدي إلى حدوث تعارض). 4. الفئات المجهولة لقد تحدثنا بالفعل عن الفئات المجهولة أعلاه، وكما تتذكر، يمكن إنشاؤها من مصدرين - الواجهات والفئات. يتم استخدام أسباب استخدام الفئات الداخلية الثابتة وغير الثابتة لأنه في بعض الأحيان يكون من الأفضل تضمين فئات صغيرة داخل فئات أكبر والاحتفاظ بها معًا: وبهذه الطريقة سيكون لديهم تماسك أعلى وهدف مشترك. في الواقع، يؤدي استخدام الفئات المتداخلة إلى زيادة تغليف التعليمات البرمجية. قد يكون سبب اختيار الفئات المحلية هو استخدام فئة معينة حصريًا ضمن طريقة واحدة. في هذه الحالة، هل من الضروري نشر الكود في جميع أنحاء التطبيق؟ لا. لكن في الوقت نفسه سأضيف أنه في ممارستي لم أر قط استخدامًا للفصول المحلية، لأنه الحاجة إليها مثيرة للجدل إلى حد كبير. حسنًا، قد يكون سبب استخدام الفئات المجهولة هو أن هناك حاجة إلى تنفيذ محدد لواجهة أو فئة مجردة مرة واحدة فقط، لذلك ليست هناك حاجة لإنشاء فئة منفصلة كاملة مع تطبيق لهذا الغرض. بدلاً من ذلك، وبطريقة بسيطة، قمنا بتنفيذ الطريقة (الطرق) التي نحتاجها من خلال فئة مجهولة، واستخدمنا هذا الكائن ونسيناه (حسنًا، تذكره جامع البيانات المهملة). هذا وهذه المقالة تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 8ستساعدك على دراسة الفصول الداخلية بمزيد من التفصيل .

51. ما هي معدّلات الوصول التي يمكن أن يتمتع بها الفصل الدراسي؟

كما نتذكر، هناك أنواع مختلفة من الفئات وتنطبق عليها معدلات وصول مختلفة:
  • يمكن أن يكون للفئة الخارجية معدل الوصول عام أو بدون معدل (المعدل الافتراضي)؛
  • تدعم الفئة الداخلية جميع معدّلات الوصول الأربعة؛
  • تدعم الفئة الثابتة المتداخلة جميع معدّلات الوصول باستثناء المحمية ، لأن يتضمن هذا المعدل الوراثة، وهو ما يتعارض مع العضو الثابت في الفئة (العناصر الثابتة غير موروثة)؛
  • يمكن أن تحتوي الفئة المحلية فقط على مُعدِّل افتراضي (أي لا يوجد مُعدِّل على الإطلاق)؛
  • فئة مجهولة : إذا لم يكن هناك تعريف لنوع الفئة، فلن تكون هناك معدّلات وصول على الإطلاق.
هذا هو المكان الذي سنتوقف فيه اليوم. اراك قريبا!تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 5 - 9
مواد أخرى في السلسلة:
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION