مرحبًا بالجميع، سأواصل اليوم تحليل أكثر من 250 سؤالًا لمقابلة مطور Java. الأجزاء السابقة من التحليل: الأول ، الثاني ، الثالث . لذلك دعونا نستمر.
<اسم الفئة>{الميراث من فئة الأصل} {تنفيذ الواجهة}
لذا، ما لدينا: {class access modifier} - فقط المعدلات العامة ومعدلات الوصول المفقودة، أي الافتراضي، متاحة للفئة . {class static} - static هو مُعدِّل يشير إلى أن هذه الفئة ثابتة، ولا تنطبق إلا على الفئات الداخلية (الفئات الموجودة داخل الفئات الأخرى). {نهائية الفئة} - كما نتذكر، هذا هو المعدل النهائي ، الذي في وجوده تصبح الفئة غير قابلة للتوريث (مثال من المربع - سلسلة ). {class Abstraction} - modifier - Abstract ، مما يشير إلى أن هذه الفئة قد تحتوي على أساليب غير منفذة. يتعارض هذا المعدل مع المعدل النهائي ، أي أنه يمكن أن يكون واحدًا منهم فقط في رأس الفصل، نظرًا لأن المعدل المجرد يعني أن الفئة المحددة سيتم توريثها وسيتم تنفيذ أجزائها المجردة. ويشير Final إلى أن هذه هي النسخة النهائية (النهائية) للفئة، ولا يمكن توريثها. في الواقع، استخدام كلا المعدلين في نفس الوقت سيكون أمرًا سخيفًا، ولن يسمح لنا المترجم بالقيام بذلك. <class> هي كلمة أساسية مطلوبة تشير إلى إعلان الفئة. <اسم الفئة> هو اسم فئة بسيط، وهو معرف فئة Java محددة. يتكون اسم الفئة المؤهلة بالكامل من اسم الحزمة المؤهلة بالكامل + . + اسم فئة بسيط. {الميراث من فئة الأصل} - تحديد الفئة الأصلية (إن وجدت) باستخدام الكلمة الأساسية الممتدة . على سبيل المثال، .. يمتد ParentClass . {تنفيذ الواجهة} - تحديد الواجهات التي تنفذها هذه الفئة (إن وجدت) باستخدام الكلمة الأساسية المنفذة . على سبيل المثال: ... تنفذ FirstInterface وSecondInterface ... حسنًا، كمثال لرأس الفئة، فكر في رأس فئة Lion ، التي ترث من Cat وتنفذ واجهة WildAnimal :
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;
}
ولكن عندما يتعلق الأمر بقيم محددة، لا يمكن للمنشئ استخدام العودة لإرجاع قيمة للأسباب التالية:
- عند الإعلان عن مُنشئ لن يكون لديك أي شيء يشبه نوع الإرجاع؛
- عادة، يتم استدعاء المنشئ ضمنيًا أثناء إنشاء مثيل؛
- المُنشئ ليس طريقة: إنه آلية منفصلة هدفها الوحيد هو تهيئة متغيرات الحالة، والمشغل الجديد مسؤول عن إنشاء كائن .
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. ما هي العناصر التي يتكون منها رأس الفصل؟ اكتب مثالا
عند الحديث عن العناصر التي تشكل رأس الفصل، دعونا نلقي نظرة على رسم تخطيطي صغير:- المكونات الإلزامية ستكون بين قوسين <>
- اختياري - في {}
public final class Lion extends Cat implements WildAnimal
32. ما هي العناصر التي يتكون منها رأس الطريقة؟ اكتب مثالا
مرة أخرى، عند النظر إلى العناصر التي تشكل رأس الطريقة، فكر في رسم تخطيطي صغير حيث:- المكونات الإلزامية بين قوسين <>
- اختياري - في {}
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);
}
}
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 واستدعاء المنشئ الأول، سيتم استدعاء كلا حقلي الكائن وتهيئتهما بنجاح. هناك بضعة فروق دقيقة:
- this() يعمل فقط في المُنشئ.
- يجب أن تكون الإشارة إلى مُنشئ آخر في السطر الأول من كتلة المُنشئ (النص). لذلك، لا يمكن استدعاء أكثر من مُنشئ (آخر) لفئة معينة في مُنشئ واحد.
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";
}
هذه الكتلة هي بالضبط نفس الكتلة السابقة. ولكن إذا تم تشغيل الكائن العادي عند تهيئة كل كائن، فسيتم تشغيل الكائن الثابت مرة واحدة فقط، عند تحميل الفصل. في مثل هذه الكتلة، كقاعدة عامة، يتم أيضًا إجراء بعض الحسابات المعقدة للتهيئة اللاحقة لمتغيرات الفئة الثابتة. تنطبق نفس القيود على الكتلة الثابتة كما هو الحال مع الأساليب الثابتة: لا يمكنها استخدام بيانات غير ثابتة، بالإضافة إلى مرجع إلى الكائن الحالي - هذا . بعد ذلك، يمكننا رؤية ترتيب تهيئة الفصل (مع سلفه) لفهم أفضل للحظة التي يتم فيها تشغيل كتل التهيئة.
36. لوراثة فئة عامة، يمتد الطفل إلى الوالدين، اكتب ترتيب تهيئة الكائن
عندما يتم تحميل فئة الطفل، سيكون ترتيب التهيئة كما يلي:- الحقول الثابتة للفئة الأصل .
- كتلة التهيئة الثابتة للفئة الأصل .
- الحقول الثابتة لفئة الطفل .
- كتلة التهيئة الثابتة لفئة الطفل .
- الحقول غير الثابتة للفئة الأصل .
- ليست كتلة تهيئة ثابتة للفئة الأصل .
- منشئ لفئة الوالدين .
- الحقول غير الثابتة لفئة الطفل .
- ليست كتلة تهيئة ثابتة للفئة التابعة .
- منشئ فئة الطفل .
37. ما هي العلاقات التي تعرفها بين الفئات (الأشياء)؟
هناك نوعان من العلاقات بين الفئات في Java:- علاقة IS-A
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();
}
}
أي أننا لا نهتم بعدد الركاب (أو ما إذا كان هناك أي ركاب على الإطلاق): لا تعتمد وظيفة فئة السيارة على هذا. يشير التجميع أيضًا إلى أنه عند استخدام كائن بواسطة كائن آخر، يمكن استخدام الكائن الأول في كائنات أخرى. على سبيل المثال، يمكن للطالب نفسه أن يكون عضوًا في نادي الحياكة وفي مجموعة موسيقى الروك، وفي نفس الوقت يذهب إلى مجموعة من متعلمي اللغة الإنجليزية. كما تفهم، التجميع هو علاقة ترابطية أكثر مرونة بين الطبقات. يعتبر التركيب علاقة أكثر صرامة عندما لا يكون الكائن مجرد جزء من كائن آخر، ولكن عمل الكائن الآخر يعتمد بشكل كبير على الأول. على سبيل المثال، محرك السيارة. ورغم أن المحرك قد يوجد بدون السيارة، إلا أنه لا فائدة منه خارجها. حسنًا، لا يمكن للسيارة أن تعمل بدون محرك:
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
void startMoving() {
engine.start();
...
}
يشير التركيب أيضًا إلى أنه عند استخدام كائن ما بواسطة كائن آخر، فإن الأول لا يمكن أن ينتمي إلى شخص آخر. إذا عدنا إلى مثالنا، يمكن أن ينتمي المحرك لسيارة واحدة فقط، ولكن ليس لسيارتين أو أكثر في نفس الوقت. ربما سنتوقف هنا اليوم.
GO TO FULL VERSION