1

Hvad er instanceof i Java?

Nogle va­ri­ab­lers natur i Java er ikke altid umid­del­bart ind­ly­sen­de. I store Java-projekter med mange variabler kan ind­tast­nings­da­ta for eksempel få en variabel til at fremstå som for­skel­li­ge objekter. Derfor giver pro­gram­me­rings­spro­get brugerne instanceof. Denne Java-operator sikrer, at instansen af en re­fe­ren­ce­va­ri­a­bel virkelig svarer til en klasse, un­der­klas­se eller græn­se­fla­de. Hvis der er et match, udgiver ope­ra­to­ren den boolske værdi ‘true’. Hvis der ikke er noget match, er udgangen ‘false’.

Når du kon­ver­te­rer et ukendt objekt, er det vigtigt at bruge Java instanceof for at sikre, at objektet tilhører den antagne klasse. Hvis du springer denne sik­ker­heds­kon­trol over, kan der opstå en Clas­sCa­stE­x­cep­tion. Dette sker, når et objekt skal kon­ver­te­res til en anden klasse. Fejl­med­del­el­sen kan være for­vir­ren­de og kan forårsage problemer, hvis koden er særlig lang. Derfor er det bedst at bruge Java instanceof tidligt som en sik­ker­heds­for­an­stalt­ning.

Hvad er syntaksen for instanceof?

Når du bruger instanceof i Java, sam­men­lig­ner ope­ra­to­ren en re­fe­ren­ce­va­ri­a­bel med en bestemt klasse, der også er angivet af brugeren. Den in­de­hol­der ikke yder­li­ge­re op­lys­nin­ger om objektets eller klassens art. Den afgør blot, om der er et match eller ej. Syntaksen er enkel og ser således ud:

(object) instanceof (class)
java

Hvis (object) er en instans af (class), vises ‘true’. Hvis dette ikke er tilfældet, vises ‘false’.

Eksempler på instanceof i Java

Først viser vi dig et kort eksempel på, hvordan instanceof fungerer i Java. Her opretter vi en klasse kaldet ‘Animal’.

public class Animal {
}
java

Det næste trin er at udvide denne klasse med en un­der­klas­se kaldet ‘Cat’.

public class Cat extends Animal {
}
java

Nu kan vi bruge Java instanceof til at kon­trol­le­re, om en instans af Cat tilhører klassen Animal. For at gøre dette skriver vi nogle flere linjer kode og udskriver re­sul­ta­tet med Java-kom­man­do­en 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

Re­sul­ta­tet skal se sådan ud:

true
java

Flere niveauer og ob­jekt­klas­sen

Dette princip fungerer også med Main-klassen og andre un­der­klas­ser. Det næste eksempel in­de­hol­der flere niveauer, og vi har udvidet instanceof i Java med if-else. Du vil måske bemærke, at der er tilføjet noget ekstra tekst efter to skrå­stre­ger (//). Dette er Java-kom­men­ta­rer. De forklarer de enkelte trin, men har ingen ind­fly­del­se på outputtet.

// 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

Når vi ser på vores eksempel, kan vi se, at cat1 er en instans af klassen Cat og su­per­klas­sen Animal. Som sådan er svaret på begge spørgsmål ‘true’. Da Object, eller klassen java.lang.Object, er øverst i hie­rar­ki­et, er cat1 også en instans af Object. Så instanceof ope­ra­to­ren vil altid give true, når den bruges med klassen Object. Outputtet ser sådan ud:

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

Output med en null-værdi

Hvis en variabel har en null-værdi (dvs. ikke in­de­hol­der et objekt), udgiver Java-ope­ra­to­ren instanceof au­to­ma­tisk ‘false’. Lad os se, hvordan dette fungerer, med følgende eksempel:

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

Outputtet i dette tilfælde er:

cat2 is NOT an instance of Cat
java

Su­per­klas­se/un­der­klas­se

Selvom objekter i un­der­klas­ser også tilhører un­der­klas­sens til­sva­ren­de over­klas­ser, fungerer det ikke omvendt. Følgende eksempel hjælper med at il­lu­stre­re dette aspekt af klas­se­hie­rar­ki­et:

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

Outputtet i dette tilfælde er:

Bello is NOT an instance of Cat
java

Fejl­med­del­el­se for in­kom­pa­tib­le typer

Hvis der ikke er nogen for­bin­del­se mellem et objekt og en klasse, vises en fejl­med­del­el­se. For at il­lu­stre­re dette opretter vi en ny klasse kaldet ‘Dog’, som tilhører su­per­klas­sen Animal, men som ikke har nogen for­bin­del­se til Cat.

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

I denne situation modtager vi en fejl­med­del­el­se, der fortæller os, at der ikke er nogen for­bin­del­se mellem klasserne Cat og Dog. Med­del­el­sen ser sådan ud:

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

I vores digitale guide finder du flere spændende tutorials og in­for­ma­ti­ve artikler om Java. Du kan finde en sam­men­lig­ning af Java og Ja­va­Script samt en sam­men­lig­ning af Java og Python. Du kan også læse mere om Java-bitvise ope­ra­to­rer.

0687bc550aa0109b9b5aed2f84420782

Gå til ho­ved­me­nu­en