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

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

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

20. ما هي العناصر اللغوية المسؤولة عن التغليف؟

كما نتذكر، التغليف يخفي تفاصيل تنفيذ فئة ما. أي أنه عندما يتم استخدام فصلنا خارجيًا، فإن المحتويات الداخلية والمنطق غير واضحين. وما هي عناصر اللغة المسؤولة عن ذلك؟ وبطبيعة الحال، معدّلات الوصول ! نحدد ما نحتاج إلى إخفاءه باستخدام المعدل الخاص . على سبيل المثال، الحقول الخاصة للفئة أو بعض الأساليب الداخلية التي تساعد في تنفيذ وظائف داخلية معينة. وإلى ما نريد توفير الوصول الخارجي إليه، نضيف معدّل الوصول العام . على سبيل المثال، طريقة مسؤولة عن توفير بعض الوظائف (التي يمكن من خلالها استخدام العديد من الطرق الخاصة) أو نفس الحروف والمحددات للوصول إلى الحقول الخاصة للفئة. أوه، ولدينا أيضًا المعدلات الافتراضية والمحمية ، والتي يمكن استخدامها لتكوين أكثر مرونة وتحديدًا للوصول إلى أجزاء محددة من الفصل.

21. ما هي العناصر اللغوية المسؤولة عن الميراث؟

الميراث هو آلية تسمح لك بإنشاء فئات بناءً على فئة أخرى. في Java، يتم استخدام الكلمة الأساسية الممتدة لهذا الغرض . على سبيل المثال، لدينا فئة معينة من Cat ، ونريد إنشاء خليفتها - Lion . في الكود سوف يبدو مثل هذا:
public class Lion extends Cat
وهذا يعني أن فئة Lion ترث جميع أساليب ومتغيرات فئة Cat ، باستثناء المتغيرات الثابتة. كما أن العناصر اللغوية المسؤولة عن الميراث تشمل super . هذا مرجع مشابه لهذا ، ولكن بينما يشير هذا إلى الكائن الذي تم استدعاؤه عليه، يشير super إلى الكائن الأصلي الحالي. عادةً ما يتم استخدام السوبر :
  1. لاستدعاء مُنشئ فئة فائقة: على سبيل المثال، تحتوي فئة Cat على اسم متغير داخلي يحتاج إلى تهيئته في المُنشئ. في مُنشئ فئة Lion سيبدو الأمر كما يلي:

    public Lion(final String name) {
       super(name);
    }
  2. للوصول إلى الحقول والطرق الأصلية: على سبيل المثال، في فئة Cat لدينا حقل عمر تمت تهيئته :

    public class Cat {
       int age = 10;
وفي الوقت نفسه، لدينا نفس الحقل الذي تمت تهيئته في Lion :
public class Lion extends Cat {
   int age = 15;
وإذا أردنا الوصول إلى متغير العمر للكائن الأصلي من الكائن Lion ، فعلينا القيام بذلك من خلال super :
super.name

22. ما هي العناصر اللغوية المسؤولة عن تعدد الأشكال؟

تعدد الأشكال هو قدرة كائن ذو توقيع واحد على اتخاذ أشكال عديدة (تطبيقات متعددة). يمكننا أن نقول بأمان أن الكلمات الرئيسية المنفذة والممتدة في Java تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 3 - 2هي المسؤولة عن تعدد الأشكال . تنفيذ - عندما نقوم بإنشاء واجهتنا، فإننا نقوم بتنفيذ أحد أشكالها المحتملة في بعض الفئات، ولكنه ليس الشكل الوحيد، أليس كذلك؟ دعونا نتذكر كيف تبدو أدوات التنفيذ :
public class Cat implements Animal
وفي فئة Cat يجب علينا تنفيذ جميع الأساليب المجردة المقدمة في واجهة الحيوان . الأمر نفسه ينطبق على الميراث: في فئة سليل يمكننا تجاوز التنفيذ الموجود بالفعل للطريقة. على سبيل المثال: عدة أحفاد -> عدة تجاوزات مختلفة لنفس الطريقة. حسنًا، إما أن الطبقة الفائقة كانت مجردة ولديها طريقة معينة يجب تنفيذها بطريقة خاصة لكل فرد من أحفادها. وهذا يعني أنه يمكننا القول أن الطريقة ستتخذ أشكالًا عديدة. أيضًا، يمكن أن يساعدنا التعليق التوضيحيOverride في هذا ، والذي يتم وضعه فوق الطرق المنفذة ويشير إلى أننا نريد تنفيذ أو تجاوز (إذا كان التنفيذ موجودًا بالفعل في الفئة الفائقة) طريقة أو أخرى من الفئة الفائقة أو الواجهة. إنه اختياري ويستخدم لتسهيل اكتشاف الأخطاء. باستخدام هذا التعليق التوضيحي، فإنك تشير إلى المترجم أنك تريد تجاوز/تنفيذ طريقة الطبقة الفائقة/الواجهة، وسيضمن عدم ارتكاب أخطاء في توقيع الطريقة.

23. ما هو الصلب؟ أعط أمثلة

SOLID هو اختصار لمبادئ التصميم الأساسية الخمسة لـ OOP، التي صاغها روبرت مارتن. ق - مبدأ المسؤولية الفردية - مبدأ المسؤولية الفردية، الذي ينص على أن الفصل يجب أن يكون له هدف واحد فقط وغاية واحدة. أي أنه لا يجب عليك إنشاء فصول تقوم بكل شيء. في هذه الحالة، يمكنك إعادة إنتاج النمط المضاد لـ "Divine Object". إذا كان لديك كائن Cat ، فيجب أن يحتوي على أساليب تتفاعل فقط مع وظائفه الداخلية، وليس منطق الأعمال الذي لا علاقة له بهذا المثيل. على سبيل المثال، نوع من حفظ الكائنات من هذا النوع في مكان ما. يجب نقل هذه الوظيفة الخارجية (المتعلقة بـ Cat ) إلى فئات أخرى، وبعض الخدمات التي تتمثل مهمتها في توفير منطق الأعمال للكائنات من هذا النوع. O - مبدأ الانغلاق المفتوح - مبدأ الانفتاح/الانغلاق. وهذا يعني أن الكيانات البرمجية (الفئات، الواجهات) يجب أن تكون مفتوحة للتوسيع، ولكنها مغلقة للتعديل. على سبيل المثال، كنا بحاجة إلى وظيفة مشابهة لوظيفة فئة Cat الموجودة بالفعل ، ولكنها مختلفة قليلاً. بدلاً من تغيير وظيفة فئة Cat ، وكسر الأماكن التي تم استخدامها فيها بالفعل، نستخدم الميراث أو التركيب . ونتيجة لذلك، حققنا هدفنا من خلال الوظيفة المعدلة لفئة Cat ، ولكن في نفس الوقت لم نغيرها أو نكسر أي شيء. L - مبدأ الاستبدال ليسكوف - مبدأ الاستبدال لباربرا ليسكوف. ينص المبدأ على أن الوظيفة التي تستخدم النوع الأساسي يجب أن تكون قادرة على استخدام الأنواع الفرعية من النوع الأساسي دون معرفتها. على سبيل المثال، يجب أن تكون فئة Cat قابلة للتبديل مع أي من أحفادها، مثل Lion ، دون تغيير السلوك بشكل أساسي. يظل المنطق العام (السلوك) كما هو، لكن تفاصيل تنفيذ هذه الوظيفة أو تلك تتغير. ط - مبدأ فصل الواجهة - مبدأ فصل الواجهة. ينص هذا المبدأ على أنه من الأفضل أن يكون لديك العديد من الواجهات المتخصصة (مركزة بشكل ضيق) بدلاً من وجود واجهة عالمية واحدة. على سبيل المثال، يقوم المستخدم بتنفيذ بعض الواجهات، والتي يحتاج منها فقط إلى هذه الطريقة، ولكن هذه الواجهة تحتوي على تسع طرق أخرى لا علاقة لها بمنطق الطريقة المطلوبة. في هذه الحالة، سيحتاج المستخدم إلى تنفيذ عشر طرق للواجهة، تسعة منها غير ضرورية بالنسبة له! بدلاً من ذلك، من الأفضل إنشاء عشر واجهات مختلفة يمكن تنفيذها إذا لزم الأمر. حسنًا، أو ليس عشرة، ولكن العديد منها، والتي سيكون لها طرق ترتبط ارتباطًا وثيقًا بالغرض المشترك للواجهة. د - مبدأ انعكاس التبعية- مبدأ انعكاس التبعية. وينص المبدأ على أن الوحدات في المستويات الأعلى لا ينبغي أن تعتمد على الوحدات في المستويات الأدنى. ويوصف هذا المبدأ أيضًا بأنه "لا ينبغي أن يعتمد التجريد على التفاصيل، بل يجب أن تعتمد التفاصيل على التجريد". وهذا يعني أنه يجب علينا بناء منطقنا من خلال الإشارة إلى الواجهات، وعندها فقط قم بتمرير كائنات محددة إلى هذه الوظيفة، والتي تقوم فئاتها بتنفيذ الواجهة المطلوبة. على سبيل المثال، إذا كانت لدينا واجهة Cat وبعض تطبيقاتها، على سبيل المثال، Lion و HomeCat ، فإننا نبني منطق تفاعلنا على وجه التحديد مع نوع واجهة Cat ، وعندها فقط نستبدل تطبيقًا محددًا لـ Lion أو HomeCat ، ولكن ليس العكس.

24. ما هي الفئة، الكائن، الواجهة؟

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

25. ما هي فئة POJO؟ أعط مثالا على مثل هذه الفئة

تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 3 - 4POJO - كائن Java قديم عادي - كائن Java قديم جيد: كائن بسيط من فئة غير موروث من أي فئة محددة ولا ينفذ أي واجهات خدمة تتجاوز تلك المطلوبة لنموذج الأعمال. بمعنى آخر ، فئة POJO هي مجرد فئة ليس لها متطلبات خاصة. الشرط الوحيد هو عدم وجود أجراس وصفارات مختلفة مرتبطة بإطار محدد. كقاعدة عامة، لا ترث هذه الفئات من الفئات الأخرى (باستثناء فئات POJO من نفس الحزمة)، ولا تنفذ واجهات - في بعض الأحيان يتم إجراء استثناء لواجهات العلامات من المكتبة القياسية مثل القابلة للتسلسل أو القابلة للاستنساخ - لا تستخدم التعليقات التوضيحية ولا تعتمد على مكتبات الطرف الثالث. لكنني ألاحظ أن POJOs يمكن أن يكون لديها أساليب تتعلق بمنطق الأعمال والمنشئات من أي نوع. إذا سمحت بالتعليقات التوضيحية التي لا تُجري تغييرات على دلالات الفئة (والتي بدونها لن يتغير غرض الكائن ومنطق تشغيله)، فيمكن أن تتضمن POJO أيضًا كيانات JPA وكائنات DTO التي تم إلغاء تسلسلها من XML أو JSON ، القواعد التي تم تحديدها في الشروح. يُنصح أيضًا بتجاوز يساوي و hashCode لفئات POJO ، لأن هذا قد يساعدهم على أداء دورهم بشكل أفضل. مثال لفئة POJO :
public class User {
   private Long id;
   private String firstName;
   private String lastName;
   private Long age;

   public User(final Long id, final String firstName, final String lastName, final long age) {
       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }

   public Long getId() {
       return this.id;
   }

   public String getFirstName() {
       return this.firstName;
   }

   public String getLastName() {
       return this.lastName;
   }

   public Long getAge() {
       return this.age;
   }

   @Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || this.getClass() != o.getClass()) return false;
       final User user = (User) o;
       return Objects.equals(this.id, user.id) &&
               Objects.equals(this.firstName, user.firstName) &&
               Objects.equals(this.lastName, user.lastName) &&
               Objects.equals(this.age, user.age);
   }

   @Override
   public int hashCode() {
       return Objects.hash(this.id, this.firstName, this.lastName, this.age);
   }
}

26. ما هي العناصر التي يمكن أن يحتويها الفصل؟

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

27. شرح الميراث في لغة جافا. ما هي فوائد استخدام الكلمة الرئيسية سوبر؟

لقد تحدثت أعلاه بالفعل عن الميراث والكلمة الرئيسية الفائقة في Java. دعني أذكر بعض النقاط الأكثر أهمية:
  1. من الممكن أن ترث فئة واحدة فقط: لا يوجد وراثة متعددة في Java (ولكن مع ظهور الأساليب الافتراضية في Java 8، سيصبح هذا البيان مثيرًا للجدل للغاية).
  2. يتم أيضًا توريث الأساليب والحقول الخاصة، ولن يتمكنوا من الوصول إليها من الوريث (ولكن إذا كان لدينا، على سبيل المثال، حقل خاص وهناك حروف ومحددات عامة أو محمية له، فيمكن العمل مع الحقل من خلالهم).
  3. لا يتم توريث الطبقات النهائية .
  4. لا يتم تجاوز الأساليب النهائية (ولكن يمكن توريثها وتحميلها بشكل زائد).
  5. لا يتم توريث الأساليب والمتغيرات الثابتة (نظرًا لأنها لا ترتبط بالكائنات، بل بالفئات).
  6. عند الوراثة من الفئات المجردة، يلزم تنفيذ أساليبها المجردة، أو يجب أيضًا إعلان الفئة الحالية مجردة.
  7. إذا كانت هناك مُنشئات غير افتراضية في الأصل، فيجب تجاوزها في الفصل الفرعي (ولكن لا تتم كتابة @Override فوقها).
  8. يمكن توسيع الأساليب التي تم تجاوزها في التابع باستخدام معدّل الوصول: خاص -> افتراضي -> محمي -> عام .
  9. يمكن للطرق التي تم تجاوزها في التابع تضييق الاستثناءات المكتوبة، على سبيل المثال: Exception -> IOException -> FileNotFoundException.
تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 3 - 5

28. ما هو أسلوب التوقيع؟ أعط أمثلة على التوقيعات الصحيحة والخاطئة

توقيع الطريقة هو اسم الطريقة بالإضافة إلى أنواع المعلمات الواردة (وترتيب المعلمات مهم). لا يتضمن توقيع الطريقة القيمة المرجعة أو الاستثناءات التي يطرحها. مثال على التوقيع الصحيح:
doSomething(int, double, double)
مثال على توقيع غير صحيح:
void doSomething(int firstArg, int secondArg) throws Exception
يُطلق على توقيع الطريقة، جنبًا إلى جنب مع نوع الإرجاع وقائمة الاستثناءات التي تم طرحها، اسم عقد الطريقة . هذا كل شيء لهذا اليوم. أراك لاحقًا!تحليل الأسئلة والأجوبة من المقابلات لمطور جافا.  الجزء 3 - 6
مواد أخرى في السلسلة:
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION