English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، ستعرف عن محulator instanceof لـ Java من خلال الأمثلة.
في Java، هو كلمة instanceof ثنائية. يستخدم لتحقق ما إذا كان المثال هو مثيل لفئة معينة.
يتحقق المشغل أيضًا ما إذا كان المثال هو مثيل لفئة تُحقق واجهة (سيتم مناقشة ذلك في هذا الدرس لاحقًا).
جملة instanceof تكون:
result = objectName instanceof className;
المشغل اليساري لـ instanceof هو اسم المثال، والمشغل اليمنى هو اسم الفئة. إذا كان المثال هو مثيل للفئة، فإن النتيجة هي true؛ وإذا لم يكن كذلك، فإن النتيجة هي false.
class Main { public static void main (String[] args) { String name = "w3codebox"; Integer age = 22; System.out.println("هل name مثيلًا لـ String؟: " + (name instanceof String)); System.out.println("هل age مثيلًا لـ Integer؟: " + (age instanceof Integer)); } }
الإخراج:
هل name مثيلًا لـ String؟: صحيح هل age مثيلًا لـ Integer؟: صحيح
في المثال السابق، قمنا بإنشاء مثيل لـ String يُدعى name ومثيل آخر لـ Integer يُدعى age. ثم استخدمنا محulator instanceof لتحقق ما إذا كان name من نوع String وage من نوع Integer.
في حالة الإرث، يستخدم محulator instanceof لتحقق ما إذا كان مثيل فئة الفرعية هو أيضًا مثيلًا لفئة الأب.
class Animal { } //فئة Dog هي فئة فرعية لفئة Animal class Dog extends Animal { } class Main { public static void main(String[] args){ Dog d1 = new Dog(); //تحقق من whether d1 is an instance of Dog System.out.println("هل d1 هو مثال على فئة Dog: " + (d1 instanceof Dog)); //تحقق من whether d1 is an instance of Animal System.out.println("هل d1 هو مثال على فئة Animal: " + (d1 instanceof Animal)); } }
الإخراج:
هل d1 هو مثال على فئة Dog: صحيح هل d1 هو مثال على فئة Animal: صحيح
في المثال السابق، d1 هو مثال على فئات Dog وAnimal. لذلك، d1 instanceof Dog و d1 instanceof Animal تكون صحيحة.
في Java، تنسق جميع الفئات مع فئة Object، ولاتستخدم كلمة المفتاح extends للتنسيق مع فئة Object. يحدث هذا التنسيق بشكل تلقائي في Java.
class Animal { } class Dog { } class Cat { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = new Animal(); Cat c1 = new Cat(); System.out.println("هل d1 هو مثال على فئة Object: " + (d1 instanceof Object)); System.out.println("هل a1 هو مثال على فئة Object: " + (a1 instanceof Object)); System.out.println("هل c1 هو مثال على فئة Object: " + (c1 instanceof Object)); } }
الإخراج:
هل d1 هو مثال على فئة Object: صحيح هل a1 هو مثال على فئة Object: صحيح هل c1 هو مثال على فئة Object: صحيح
في المثال السابق، قمنا بإنشاء كائنات من الفئات Animal وDog وCat باسم a1 وd1 وc1. قمنا باستخدام عمليات التحقق instanceof لتحديد ما إذا كانت هذه الكائنات a1 وd1 وc1 هي كائنات من فئة Object. كانت النتائج جميعها صحيحة (صحيحة).
هذا لأن فئة Object هي الجذر في حزمة java.lang. جميع الفئات الأخرى هي فئات فرعية لفئة Object التي تشكل هيكلًا هرميًا في Java.
في Java، يمكن اعتبار كائن فرعي ككائن آبوي. يُسمى هذا التحول بتحويل للأعلى.بشكل بسيط يمكن القول إنه تحويل كائن فرعي إلى كائن آبوي. يمكن أن يكون الكائن الأبوي هو واجهة.
يتم تنفيذ تحويل النوع إلى الأعلى تلقائيًا بواسطة محول Java.
class Animal { public void displayInfo() { System.out.println("أنا حيوان."); } } class Dog extends Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; a1.displayInfo(); } }
الإخراج:
أنا حيوان
في المثال السابق، قمنا بإنشاء جسم الفئة Dog d1. استخدمنا جسم d1 لإنشاء جسم الفئة Animal a1. هذا يُدعى في Java بتحويل النوع إلى الأعلى.
يتم تنفيذ هذا الكود بدون مشاكل. هذا لأن تحويل النوع إلى الأعلى يتم تلقائيًا بواسطة محول Java.
تحويل النوع إلى الأسفل هو العكس من تحويل النوع إلى الأعلى، أي العكس من تحويل النوع إلى الأعلى، وهو تحويل جسم الفئة الأم إلى جسم الفئة الفرعية.
في تحويل النوع إلى الأسفل، يتم اعتبار الجسم من الفئة الأم كجسم من الفئة الفرعية. يجب علينا في Java إشارة بوضوح إلى محول التحويل إلى الأسفل.
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("أنا كلب."); } } class Main { public static void main(String[] args) { Animal a1 = new Animal(); Dog d1 = (Dog)a1; // تحويل إلى النوع السفلي d1.displayInfo(); } }
عند تشغيل البرنامج، سيتم الحصول على استثناء ClassCastException. دعونا نرى ما يحدث هنا.
في هذا السياق، قمنا بإنشاء جسم الفئة الأم Animal a1. ثم حاولنا تحويل جسم a1 إلى جسم الفئة الفرعية Dog d1.
هذا أحدث مشكلة. هذا لأن جسم a1 من الفئة الأم Animal قد يشير أيضًا إلى فئة فرعية أخرى. إذا قمنا بإنشاء فئة فرعية أخرى مثل Cat مع Dog، فإن الحيوان قد يكون كلبًا أو قطة، مما يسبب عدم وضوح.
لحل هذه المشكلة، يمكننا استخدام عمليات التحقق instanceof. كيف يتم القيام بذلك:
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("أنا كلب"); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; // تحويل إلى النوع الأعلى if (a1 instanceof Dog) { Dog d2 = (Dog)a1; // تحويل إلى النوع السفلي d2.displayInfo(); } } }
الإخراج:
أنا كلب
في المثال السابق، نستخدم عمليات التحقق instanceof لتحديد ما إذا كان الجسم a1 هو مثيل للفئة Dog. يتم التحويل إلى النوع السفلي فقط إذا كان تعبير a1 instanceof Dog صحيحًا.
استخدمت عمليات التحقق instanceof أيضًا للتحقق من أن مثيل الفئة هو أيضًا مثيل للواجهة التي تحقق منها.
interface Animal { } class Dog implements Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); System.out.println("هل هو مثيل لـ Animal: "+(d1 instanceof Animal)); } }
الإخراج:
هل هو مثيل لـ Animal: yes
في المثال السابق، قمنا بإنشاء فئة Dog تفي بالواجهة Animal.
ثم، قم بإنشاء عنصر Dog d1 من الفئة Dog. لقد استخدمنا عمليات التحقق instanceof لتحقق من أن عنصر d1 هو أيضًا مثيل للواجهة Animal.