39. ما هي معدلات الوصول في جافا؟ سميهم. ما يتم استخدامها ل؟
لقد قمت سابقًا بتغطية معدّلات الوصول في سؤال حول عناصر Java المستخدمة لتحقيق التغليف. ولكن مع ذلك، سأذكرك. معدّلات الوصول في Java هي كلمات أساسية تصف مستوى الوصول الممنوح لمكون Java معين. توجد معدّلات الوصول التالية:- عام — العنصر المميز بهذا المُعدِّل يكون عامًا. بمعنى آخر، الحقول والأساليب والفئات المُعلن عنها باستخدام المُعدِّل العام تكون مرئية للفئات الأخرى سواء في حزمتها الخاصة أو في الحزم الخارجية؛
- محمي - يمكن الوصول إلى العنصر المميز بهذا المعدل من أي مكان في فئته الخاصة في الحزمة الحالية أو الفئات المشتقة، حتى لو كانت في حزم أخرى؛
- الافتراضي (أو لا يوجد معدّل على الإطلاق) ينطبق ضمنيًا عند عدم الإشارة إلى معدّل الوصول. وهو مشابه للسابق، إلا أنه مرئي في الفئات المشتقة الموجودة في الحزم الأخرى؛
- خاص - هذا هو الأكثر خصوصية بين جميع المعدلات. يسمح بالوصول إلى عنصر فقط داخل الفئة الحالية.
40. اذكر السمات الرئيسية للطرق الثابتة وغير الثابتة
والفرق الرئيسي هو أن الأساليب الثابتة تنتمي إلى فئة ما. في الواقع، لا تحتاج إلى إنشاء مثيل لهذه الفئة - يمكن استدعاء الأساليب الثابتة فقط من نوع الفئة. على سبيل المثال، لنفترض أن لدينا طريقة ثابتة لمداعبة قطة:public class CatService {
public static void petTheCat(Cat cat) {
System.out.println("Pet the cat: " + cat.getName());
}
لا نحتاج إلى مثيل لفئة CatService لنسميها:
Cat cat = new Cat(7, "Bobby");
CatService.petTheCat(cat);
على النقيض من ذلك، ترتبط الأساليب العادية (تنتمي) إلى كائن ما. للاتصال بهم، يجب أن يكون لديك مثيل (كائن) سيتم استدعاء الطريقة عليه. على سبيل المثال، لنفترض أن قطتنا لديها طريقة غير ثابتة meow() :
class Cat {
public void meow() {
System.out.println("Meow! Meow! Meow!");
}
لاستدعاء هذه الطريقة، نحتاج إلى نسخة محددة من القطة:
Cat cat = new Cat(7, "Bobby");
cat.meow();
41. ما هي القيود الرئيسية التي تنطبق على الأساليب الثابتة وغير الثابتة؟
كما قلت سابقًا، القيد الرئيسي للطريقة العادية (غير الثابتة) هو أنه يجب أن يكون هناك دائمًا مثيل يتم استدعاء الطريقة عليه. لكن الطريقة الثابتة لا تتطلب ذلك. بالإضافة إلى ذلك، لا يمكن للأسلوب الثابت استخدام هذا المرجع لعناصر الكائن نظرًا لوجود كائن حالي للأسلوب.42. ماذا تعني الكلمة الأساسية الثابتة؟ هل يمكن تجاوز الطريقة الثابتة أو تحميلها بشكل زائد؟
العنصر الذي تم وضع علامة عليه بالكلمة الأساسية الثابتة لا ينتمي إلى مثيل للفئة بل إلى الفئة نفسها. يتم تحميله عند تحميل الفصل نفسه. العناصر الثابتة هي نفسها بالنسبة للبرنامج بأكمله، في حين أن العناصر غير الثابتة هي نفسها بالنسبة لكائن معين فقط. يمكن أن تكون العناصر التالية ثابتة:- مجالات الطبقة؛
- كتلة التهيئة للفئة؛
- طريقة الطبقة.
- فئات متداخلة من الفصل (بالطبع، هذا أيضًا حشو).
43. هل يمكن أن تكون الطريقة ثابتة ومجردة في نفس الوقت؟
لقد أجبت بالفعل على هذا في مقال سابق: لا يمكن أن تكون الطريقة مجردة وثابتة في نفس الوقت. إذا كانت الطريقة مجردة، فهذا يعني أنه يجب تجاوزها في فئة فرعية. لكن الطريقة الثابتة تنتمي إلى الفصل ولا يمكن تجاوزها. وهذا يخلق تناقضًا سيلاحظه المترجم وينزعج منه. إذا وجدت نفسك في هذا الموقف، فيجب أن تفكر جديًا في صحة بنية التطبيق الخاص بك (تلميح: من الواضح أن هناك خطأ ما في ذلك).44. هل يمكن استخدام الطرق الساكنة وسط الطرق غير الساكنة؟ والعكس صحيح؟ لماذا؟
يمكننا استخدام الأساليب الثابتة في الأساليب غير الثابتة. لا شيء يمنع ذلك. ومع ذلك، فإن العكس غير ممكن: لا يمكن للطريقة الثابتة استخدام طريقة غير ثابتة دون الرجوع إلى مثيل محدد للفئة. تذكر أن الأعضاء الثابتين في الفصل لا يمكنهم الوصول إلى هذا المرجع: يمكنك الحصول على أي عدد تريده من الكائنات الملموسة للفئة، وسيحتوي كل منها على هذا المرجع ، وهو مرجع ذاتي. فكيف تحدد هذا المرجع الذي يجب استخدامه؟ اه، لا تفعل ذلك. ولهذا السبب لا يمكن للعناصر الثابتة أن تشير إلى العناصر غير الثابتة دون الإشارة إلى كائن معين. في الأساس، يمكن للطريقة الثابتة استخدام طريقة غير ثابتة فقط إذا كانت تحتوي على مرجع إلى كائن معين. على سبيل المثال، الذي جاء كوسيطة أسلوب:public static void petTheCat(Cat cat) {
System.out.println("Pet the cat: " + cat.getName());
}
هنا نرى أنه في أسلوب petTheCat() الثابت يستدعي getName ، وهي طريقة عادية غير ثابتة لكائن Cat .
45. ما هي الواجهة؟ هل يمكن أن تكون هناك واجهة نهائية؟
سوف نتذكر أن Java ليس لديها وراثة متعددة. الواجهات هي شيء بديل لها. الواجهة تشبه فئة مجردة للغاية. إنها تحدد الوظيفة ولكن ليس التنفيذ الملموس. وتُترك هذه المهمة للفئات التي تنفذ هذه الواجهات. مثال للواجهة:public interface Animal {
void speak();
}
مثال على تنفيذ الواجهة بواسطة الفصل
class Cat implements Animal {
@Override
public void speak() {
System.out.println("Meow! Meow! Meow!");
}
}
إليك الشيء الرئيسي المهم الذي يجب معرفته حول استخدام الواجهات:
-
يجب أن تحتوي أساليب الواجهة على رأس فقط. يجب ألا يكون لديهم نص أسلوب محدد، أي يجب أن يكونوا مجردين (على الرغم من أنهم لا يستخدمون الكلمة الأساسية المجردة ). هناك استثناءات: الأساليب الثابتة والأساليب الافتراضية، والتي تتطلب نص الطريقة.
-
يمكن للفصل تنفيذ العديد من الواجهات (كما قلت، الواجهات هي بديل للميراث المتعدد). يتم فصل أسماء الواجهات بفواصل في رأس الطريقة: class Lion Implements Animal, Wild .
-
يتم إنشاء الواجهات باستخدام الكلمة الأساسية للواجهة .
-
عندما يقوم الفصل بتنفيذ واجهة، نستخدم الكلمة الأساسية للتنفيذ .
-
يجب على الفئة التي تنفذ واجهة معينة أن تنفذ جميع أساليبها المجردة، أو يجب أن تعلن عن نفسها مجردة.
-
الغرض الرئيسي من استخدام الواجهات هو تنفيذ تعدد الأشكال (لمنح الكائن القدرة على اتخاذ أشكال عديدة).
-
كقاعدة عامة، لا تتم الإشارة إلى معدّلات الوصول للطرق في الواجهات: فهي عامة بشكل افتراضي، ولا يمكنك تحديد معدّلات أخرى غير public . بدءًا من Java 9، يمكنك استخدام المعدلات الخاصة في الأساليب.
-
بشكل افتراضي، تكون متغيرات الواجهة نهائية ثابتة . بمعنى آخر، إنها ثوابت، ويجب دائمًا تهيئتها مباشرةً في الواجهة.
-
لا يمكنك إنشاء مثيل للواجهة.
46. أين يمكن تهيئة الحقول الثابتة؟
يمكن تهيئة الحقول الثابتة:- مباشرة بعد الإعلان، باستخدام علامة يساوي ( = )؛
- في كتلة التهيئة الثابتة؛
- في كتلة تهيئة غير ثابتة (ولكن عليك أن تفهم أنه في كل مرة يتم فيها إنشاء كائن، سيتم الكتابة فوق الحقل الثابت عند تنفيذ كتلة التهيئة هذه؛
- في منشئ الصف. في كل مرة يتم فيها استدعاء المُنشئ (أي في كل مرة يتم فيها إنشاء كائن باستخدام هذا المنشئ)، ستتم الكتابة فوق الحقل؛
- في الأساليب الثابتة.
- وبطرق غير ثابتة؛
- في فئات متداخلة ثابتة وغير ثابتة ومحلية ومجهولة.
47. ما هي الطبقات المجهولة؟
الفئات المجهولة هي فئات ليس لها نوعها الخاص. ما الذي أتحدث عنه؟ عندما تحدثنا عن الواجهات، ذكرت أنه لا يمكنك إنشاء مثيل لكائن: يمكنك فقط إنشاء مثيل لفئة تنفذ واجهة. ماذا لو كنت لا تريد أن يقوم أحد الفئات بتنفيذ واجهة ولكنك تحتاج إلى كائن ينفذ الواجهة؟ ومن المحتمل أن يكون هذا هو الاستخدام الوحيد للكائن. وليس لديك أي حاجة لإنشاء فئة تنفيذ كاملة. كيف يمكنك أن تفعل ذلك؟ صحيح! باستخدام فئة مجهولة! لنفترض أن لدينا بعض واجهة الحيوان :public final interface Animal {
public void speak();
}
إذا أردنا استخدام فئة مجهولة لإنشاء واجهة معينة:
Animal cat = new Animal() {
@Override
public void speak() {
System.out.println("Meow! Meow! Meow!");
}
};
وبعد ذلك، يمكنك استخدام هذا الكائن بأمان وطريقة التحدث () الخاصة به . بمعنى آخر، تقوم الفئة المجهولة بتنفيذ الواجهة وجميع أساليبها المجردة، هنا والآن. وإلا فلن نكون قادرين على إنشاء كائن فئة واجهة/ملخص نظرًا لأنه ستكون هناك طرق غير منفذة/مجردة. كما ذكرت، يتم استخدام الفئات المجهولة ليس فقط لتنفيذ الأساليب المجردة للواجهة ولكن أيضًا لتنفيذ الأساليب المجردة لفئة مجردة. يعد هذا الأسلوب مفيدًا في المواقف التي يتم فيها استخدام الكائن مرة واحدة أو عندما تكون هناك حاجة إلى تنفيذ طريقة معينة مرة واحدة فقط. ليست هناك حاجة لإنشاء فئة منفصلة تنفذ الفئة/الواجهة المجردة المطلوبة. لكنني ألاحظ أيضًا أن الفصول المجهولة نادرًا ما تُستخدم في العمل. كقاعدة عامة، لا تزال الطبقات العادية تعطى الأفضلية. يمكنك قراءة المزيد عن الفصول المجهولة هنا في هذه المقالة
.
48. ما هي الطبقات البدائية؟
أعتقد أن هذا سؤال مضلل، وربما سؤال خادع، نظرًا لأن Java لا تحتوي على شيء مثل الفئات البدائية. لا يوجد سوى مفهوم الأنواع البدائية الذي تناولناه سابقًا. نتذكر أن جافا لديها 8 أنواع بدائية: byte ، short ، int ، long ، float ، double ، char ، boolean .49. ما هي فئة المجمع؟
المشكلة الرئيسية في استخدام الأنواع البدائية في Java هي أنها ليست فئات، وJava هي لغة OOP. أي أن البرامج المكتوبة بهذه اللغة هي عبارة عن تفاعلات بين الكائنات. لكن البدائيين ليسوا كائنات. ليس لديهم أساليب، حتى الأساليب القياسية لفئة الكائن . ولكن ماذا لو أردنا استخدام عنصر بدائي كمفتاح في الخريطة ؟ ثم نحتاج إلى استدعاء طريقة hashCode () الخاصة بها. يمكنك أيضًا استدعاء طريقة يساوي () هناك. ماذا بعد؟ هناك الكثير من اللحظات التي تحتاج فيها إلى فصل دراسي، وليس بدائيًا. وهذا يجعل العناصر الأولية غير قابلة للاستخدام وغير مرغوب فيها في البرنامج لأنها تنتهك فكرة OOP ذاتها. لكن الوضع ليس سيئا كما يبدو. بعد كل شيء، جافا لديها مفهوم الأغلفة البدائية. في Java، كل نوع بدائي له توأم - فئة مجمعة.- بايت -> بايت.فئة
- قصيرة -> Short.class
- إنت -> Integer.class
- طويل -> طويل
- تعويم -> Float.class
- مزدوج -> Double.class
- شار- > حرف.فئة
- منطقية -> Boolean.class
50. ما هي الطبقة المتداخلة؟ أين يتم استخدامه؟
الفئة المتداخلة هي فئة تكون في حد ذاتها عضوًا في فئة أخرى. هناك 4 أنواع من هذه الفئات المتداخلة في Java: 1. الطبقة الداخلية يتم الإعلان عن هذا النوع من الفئات مباشرة في نص فئة أخرى. الفئة الداخلية هي فئة متداخلة غير ثابتة ويمكنها الوصول إلى أي حقل خاص أو طريقة مثيل للفئة الخارجية. على سبيل المثال، لنقم بإنشاء حديقة حيوانات تحتوي على حيوان — حمار وحشي:public class Zoo {
class Zebra {
public void eat(String food) {
System.out.println("Zebra eats " + food);
}
}
}
ليست معقدة، أليس كذلك؟ دعونا نلقي نظرة على مثال لإنشاء مثيل للفئة الداخلية:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.eat("apple");
كما رأيت من قبل، من الضروري أولاً إنشاء كائن من الفئة المضمنة. ثم تستخدم مرجع الكائن لإنشاء مثيل للفئة الداخلية. أود أيضًا أن أشير إلى أن الفئة الداخلية (فئة متداخلة غير ثابتة) لا يمكن أن تحتوي على طرق ثابتة أو حقول ثابتة. ويرجع ذلك على وجه التحديد إلى أن الفئة الداخلية مرتبطة ضمنيًا بمثيل فئتها الخارجية، وبالتالي لا يمكنها الإعلان عن أي طرق ثابتة داخل نفسها. 2. الفئات المتداخلة الثابتة تشبه هذه الفئات الفئة السابقة، ولكنها تحتوي على معدل الوصول الثابت في إعلان الفئة. نظرًا لأن هذا النوع من الفئات لا يمكنه الوصول إلى الحقول غير الثابتة للفئة الخارجية، فإنه يبدو وكأنه جزء ثابت من الطبقة الخارجية أكثر من كونه فئة داخلية. لكن هذه الفئة لديها إمكانية الوصول إلى جميع الأعضاء الثابتين في الطبقة الخارجية، حتى الأعضاء الخاصين. مثال على فئة متداخلة ثابتة:
public class Zoo {
static class Zebra {
public void eat(String food) {
System.out.println("Zebra eats " + food);
}
}
}
يتم إنشاؤه بشكل مختلف قليلاً عن السابق:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.eat("apple");
لا نحتاج هنا إلى كائن من الفئة الخارجية لإنشاء كائن من الفئة المتداخلة الثابتة. نحتاج فقط إلى معرفة اسم الفئة المتداخلة للعثور عليها داخل الفئة الخارجية. 3. الفئات المحلية الفئات المحلية هي فئات تم الإعلان عنها داخل نص الطريقة. يمكن إنشاء كائنات فئة محلية واستخدامها فقط ضمن الطريقة المرفقة. مثال:
public class Zoo {
public void feed(String animal, String food) {
switch(animal) {
case "zebra":
class Zebra {
public void eat(String food) {
System.out.println("Zebra eats " + food);
}
}
Zebra zebra = new Zebra();
zebra.eat(food);
...
هنا مثال:
Zoo zoo = new Zoo();
zoo.feed("zebra", "apple");
إذا لم ترَ رمز طريقة التغذية () فلن تشك حتى في وجود فئة محلية، أليس كذلك؟ لا يمكن للفئة المحلية أن تكون ثابتة أو عابرة ، ولكن يمكن تمييزها على أنها مجردة أو نهائية (واحدة أو أخرى، ولكن ليس كليهما، حيث أن استخدام هذين المعدلين في نفس الوقت يؤدي إلى حدوث تعارض). 4. الفئات المجهولة لقد تحدثنا بالفعل عن الفئات المجهولة أعلاه، وكما تتذكر، يمكن إنشاؤها من مصدرين – الواجهات والفئات. أسباب استخدامها: يتم استخدام الفئات الثابتة وغير الثابتة المتداخلة لأنه في بعض الأحيان يكون من الأفضل تضمين فئات صغيرة في فئات أكثر عمومية والاحتفاظ بها معًا بحيث يكون لديها تماسك أعلى وهدف مشترك. في الأساس، تتيح لك الفئات المتداخلة زيادة تغليف التعليمات البرمجية الخاصة بك. يمكنك اختيار استخدام فئة محلية إذا تم استخدام الفئة بشكل حصري ضمن أسلوب واحد. في هذه الحالة، هل نحتاج إلى نشر الكود على التطبيق؟ لا، ومع ذلك، سأضيف أنه من خلال تجربتي لم أر قط أي شخص يستخدم الفصول الدراسية المحلية، لأن ما إذا كانت هناك حاجة إليها أم لا أمر مثير للجدل إلى حد كبير. يمكنك استخدام فئات مجهولة عندما تكون هناك حاجة إلى تنفيذ محدد لواجهة أو فئة مجردة مرة واحدة فقط. في هذه الحالة، ليست هناك حاجة لإنشاء فئة منفصلة كاملة مع التنفيذ. بدلاً من ذلك، أبقينا الأمر بسيطًا ونفذنا الطريقة (الطرق) التي نحتاجها باستخدام فئة مجهولة، واستخدمنا الكائن، ثم نسيناه (بالطبع، لم ينس جامع البيانات المهملة). سيتم تعزيز فهمك للفئات المتداخلة من خلال المقالة هنا.
51. ما هي معدّلات الوصول التي يمكن أن يتمتع بها الفصل الدراسي؟
هناك أنواع مختلفة من الفئات وتنطبق عليها معدّلات وصول مختلفة:- يمكن أن تحتوي الفئة الخارجية على معدل الوصول العام أو لا تحتوي على أي معدل على الإطلاق (المعدل الافتراضي)؛
- يمكن أن تحتوي الفئة الداخلية (فئة متداخلة غير ثابتة) على أي من معدّلات الوصول الأربعة؛
- يمكن أن تحتوي الفئة الثابتة المتداخلة على أي من معدِّلات الوصول باستثناء المحمية لأن هذا المعدل يتضمن الوراثة، وهو ما يتعارض مع أي عضو ثابت في الفئة (لا يتم توريث الأعضاء الثابتين)؛
- يمكن للفئة المحلية أن تحتوي فقط على المُعدِّل الافتراضي (أي لا يوجد مُعدِّل على الإطلاق)؛
- لا تحتوي الفئة المجهولة على إعلان فئة، لذلك لا تحتوي على معدّل وصول على الإطلاق.
GO TO FULL VERSION