Μπορείτε να χρησιμοποιήσετε τον τελεστή Java instanceof για να ελέγξετε αν ένα αντικείμενο ανήκει σε μια συγκεκριμένη κλάση. Ο τελεστής παρέχει την απάντηση με τη μορφή μιας λογικής δήλωσης, δηλαδή «true» ή «false». Ο έλεγχος εκ των προτέρων της αντιστοιχίας μεταξύ αντικειμένου και κλάσης μπορεί να σας βοηθήσει να αποφύγετε μηνύματα σφάλματος αργότερα.

Τι είναι instanceof στη Java;

Η φύση ορισμένων μεταβλητών στη Java δεν είναι πάντα άμεσα εμφανής. Σε μεγάλα έργα Java με πολλές μεταβλητές, τα δεδομένα εισόδου, για παράδειγμα, μπορούν να προκαλέσουν την εμφάνιση μιας μεταβλητής ως διαφορετικών αντικειμένων. Αυτός είναι ο λόγος για τον οποίο η γλώσσα προγραμματισμού παρέχει στους χρήστες instanceof. Αυτός ο τελεστής Java διασφαλίζει ότι η παρουσία μιας μεταβλητής αναφοράς αντιστοιχεί πραγματικά σε μια κλάση, υποκλάση ή διεπαφή. Εάν υπάρχει αντιστοιχία, ο τελεστής εξάγει την τιμή Boolean «true». Εάν δεν υπάρχει αντιστοιχία, η έξοδος είναι «false».

Κατά τη μετατροπή ενός άγνωστου αντικειμένου, είναι σημαντικό να χρησιμοποιείτε Java instanceof για να βεβαιωθείτε ότι το αντικείμενο ανήκει στην υποτιθέμενη κλάση. Εάν παραλείψετε αυτόν τον έλεγχο ασφαλείας, ενδέχεται να εκδοθεί ένα ClassCastException. Αυτό συμβαίνει όταν ένα αντικείμενο πρέπει να μετατραπεί σε άλλη κλάση. Το μήνυμα σφάλματος μπορεί να είναι συγκεχυμένο και να προκαλέσει προβλήματα εάν ο κώδικας είναι ιδιαίτερα μακρύς. Γι’ αυτό είναι καλύτερο να χρησιμοποιείτε Java instanceof από νωρίς ως μέτρο προστασίας.

Ποια είναι η σύνταξη για instanceof;

Όταν χρησιμοποιείτε instanceof στη Java, ο τελεστής συγκρίνει μια μεταβλητή αναφοράς με μια συγκεκριμένη κλάση που καθορίζεται επίσης από τον χρήστη. Δεν περιλαμβάνει πρόσθετες πληροφορίες σχετικά με τη φύση του αντικειμένου ή της κλάσης. Απλώς καθορίζει αν υπάρχει αντιστοιχία ή όχι. Η σύνταξη είναι απλή και έχει την εξής μορφή:

(object) instanceof (class)
java

Εάν (object) είναι μια περίπτωση του (class), εμφανίζεται η ένδειξη «true». Εάν δεν ισχύει αυτό, εμφανίζεται η ένδειξη «false».

Παραδείγματα του τελεστή instanceof στη Java

Πρώτα, θα σας δείξουμε ένα σύντομο παράδειγμα για να σας δείξουμε πώς λειτουργεί instanceof στη Java. Εδώ, θα δημιουργήσουμε μια κλάση με το όνομα «Animal».

public class Animal {
}
java

Το επόμενο βήμα είναι να επεκτείνουμε αυτή την κλάση με μια υποκλάση που ονομάζεται «Cat».

public class Cat extends Animal {
}
java

Τώρα μπορούμε να χρησιμοποιήσουμε Java instanceof για να ελέγξουμε αν μια παρουσία της Cat ανήκει στην κλάση Animal. Για να το κάνουμε αυτό, θα γράψουμε μερικές ακόμα γραμμές κώδικα και θα εμφανίσουμε το αποτέλεσμα με την εντολή Java System.out.println:

public class Animal {}
public class Cat extends Animal {
public static void main(String args []{
Cat cat = new Cat();
System.out.println(cat instanceof Animal);
}
}
java

Το αποτέλεσμα θα πρέπει να μοιάζει με αυτό:

true
java

Πολλαπλά επίπεδα και η κλάση Object

Αυτή η αρχή ισχύει επίσης για την κλάση Main και άλλες υποκλάσεις. Το επόμενο παράδειγμα περιέχει διάφορα επίπεδα και έχουμε επεκτείνει τον τελεστή instanceof στη Java με if-else. Μπορεί να παρατηρήσετε κάποιο επιπλέον κείμενο μετά από δύο κάθετες (//). Αυτά είναι σχόλια Java. Εξηγούν τα μεμονωμένα βήματα, αλλά δεν επηρεάζουν το αποτέλεσμα.

// Class 1
// Superclass
public class Animal {
}
// Class 2
// Subclass
class Cat extends Animal {
}
// Class 3
// Main class
class Main {
public static void main(String[] args)
Cat cat1 = new Cat();
if (cat1 instanceof Cat)
	System.out.println ("cat1 is an instance of Cat");
else
	System.out.println ("cat1 is NOT an instance of Cat");
if (cat1 instanceof Animal)
	System.out.println ("cat1 is an instance of Animal");
else
	System.out.println ("cat1 is NOT an instance of Animal");
if (cat1 instanceof Object)
	System.out.println ("cat1 is an instance of Object");
else
	System.out.println ("cat1 is NOT an instance of Object");
	}
}
java

Κοιτάζοντας το παράδειγμά μας, μπορούμε να δούμε ότι το cat1 είναι μια περίπτωση της κλάσης Cat και της υπερτάξης Animal. Ως εκ τούτου, η απάντηση και στις δύο ερωτήσεις είναι «true». Δεδομένου ότι το Object, ή η κλάση java.lang.Object, βρίσκεται στην κορυφή της ιεραρχίας, το cat1 είναι επίσης μια περίπτωση του Object. Έτσι, ο τελεστής Java instanceof θα δίνει πάντα το αποτέλεσμα true όταν χρησιμοποιείται με την κλάση Object. Το αποτέλεσμα έχει την εξής μορφή:

cat1 is an instance of Cat
cat1 is an instance of Animal
cat1 is an instance of Object
java

Έξοδος με μηδενική τιμή

Εάν μια μεταβλητή έχει μηδενική τιμή (δηλαδή, δεν περιέχει αντικείμενο), ο τελεστής Java instanceof εκπέμπει αυτόματα την τιμή «false». Ας δούμε πώς λειτουργεί αυτό με το ακόλουθο παράδειγμα:

class Cat {
}
class Main {
public static void main(String[] args)
{
Cat cat2 = null;
if (cat2 instanceof Cat)
	System.out.println ("cat2 is an instance of Cat");
else
	System.out.println ("cat2 is NOT an instance of Cat");
	}
}
java

Η έξοδος σε αυτή την περίπτωση είναι:

cat2 is NOT an instance of Cat
java

Υπερκλάση/υποκλάση

Αν και τα αντικείμενα στις υποκατηγορίες ανήκουν επίσης στις αντίστοιχες υπερκατηγορίες της υποκατηγορίας, το αντίστροφο δεν ισχύει. Το ακόλουθο παράδειγμα βοηθά στην επεξήγηση αυτής της πτυχής της ιεραρχίας των κατηγοριών:

class Animal {
}
class Cat extends Animal {
}
class Main {
public static void main(String[] args)
{
Animal bello = new Animal ();
if (bello instanceof Cat)
	System.out.println ("Bello is an instance of Cat");
else
	System.out.println ("Bello is NOT an instance of Cat");
	}
}
java

Η έξοδος σε αυτή την περίπτωση είναι:

Bello is NOT an instance of Cat
java

Μήνυμα σφάλματος για ασυμβίβαστους τύπους

Εάν δεν υπάρχει σύνδεση μεταξύ ενός αντικειμένου και μιας κλάσης, θα εμφανιστεί ένα μήνυμα σφάλματος. Για να το δείξουμε αυτό, ας δημιουργήσουμε μια νέα κλάση με το όνομα «Dog» (Σκύλος), η οποία ανήκει στην υπερ-κλάση Animal (Ζώο), αλλά δεν έχει καμία σύνδεση με την κλάση Cat (Γάτα).

class Dog extends Animal {
}
class Main {
public static void main(String[] args)
{
Cat cat3 = new Cat ();
System.out.println (cat3 instanceof Dog);
	}
}
java

Σε αυτή την περίπτωση, θα λάβουμε ένα μήνυμα σφάλματος που θα μας ενημερώνει ότι δεν υπάρχει σύνδεση μεταξύ των κλάσεων Cat και Dog. Το μήνυμα έχει την εξής μορφή:

java.lang.Error: Unresolved compilation problem:
Incompatible conditional operand types Cat and Dog
java
Tip

Στον Ψηφιακό Οδηγό μας, θα βρείτε περισσότερα συναρπαστικά σεμινάρια και ενημερωτικά άρθρα σχετικά με τη Java. Μπορείτε να βρείτε μια σύγκριση μεταξύ Java και JavaScript, καθώς και μια σύγκριση μεταξύ Java και Python. Μπορείτε επίσης να μάθετε περισσότερα σχετικά με τους τελεστές bitwise της Java.

0b1dd7e3a0897fea2b000119fa7ad36e

8599808c2d8866e01ed62784504735aa

Go to Main Menu