Voit käyttää Java-ope­raat­to­ria instanceof tar­kis­taak­se­si, kuuluuko objekti tiettyyn luokkaan. Ope­raat­to­ri antaa vas­tauk­sen boo­le­ni­lausek­keen muodossa, eli ”true” tai ”false”. Objekti ja luokka voidaan tarkistaa etukäteen, jotta vältytään vir­heil­moi­tuk­sil­ta myöhemmin.

Mikä on instanceof Java-kielessä?

Joidenkin muut­tu­jien luonne Java-kielessä ei aina ole vä­lit­tö­mäs­ti ilmeinen. Suurissa Java-pro­jek­teis­sa, joissa on lukuisia muuttujia, esi­mer­kik­si syötetty data voi aiheuttaa sen, että muuttuja näkyy eri ob­jek­tei­na. Siksi oh­jel­moin­ti­kie­li tarjoaa käyt­tä­jil­le instanceof. Tämä Java-ope­raat­to­ri varmistaa, että viit­taus­muut­tu­jan instanssi todella vastaa luokkaa, ala­luok­kaa tai ra­ja­pin­taa. Jos vas­taa­vuus löytyy, ope­raat­to­ri tuottaa boolen arvon “true”. Jos vas­taa­vuut­ta ei löydy, tulos on “false”.

Kun muunnat tun­te­mat­to­man objektin, on tärkeää käyttää Java instanceof var­mis­taak­se­si, että objekti kuuluu ole­tet­tuun luokkaan. Jos ohitat tämän tur­va­tar­kis­tuk­sen, ClassCas­tExcep­tion-virhe voi ilmetä. Tämä tapahtuu, kun objekti on muun­net­ta­va toiseen luokkaan. Vir­heil­moi­tus voi olla häm­men­tä­vä ja aiheuttaa ongelmia, jos koodi on erityisen pitkä. Siksi on parasta käyttää Java instanceof var­hai­ses­sa vaiheessa suojana.

Mikä on syntaksi numerolle instanceof?

Kun käytät instanceof Java-kielessä, ope­raat­to­ri vertaa viit­taus­muut­tu­jaa käyttäjän mää­rit­te­le­mään tiettyyn luokkaan. Se ei sisällä li­sä­tie­to­ja objektin tai luokan luon­tees­ta. Se vain määrittää, onko vas­taa­vuut­ta vai ei. Syntaksi on yk­sin­ker­tai­nen ja näyttää tältä:

(object) instanceof (class)
java

Jos (object) on (class)n tapaus, näytetään ”true”. Jos näin ei ole, näytetään ”false”.

Esi­merk­ke­jä instanceof ope­raat­to­ris­ta Java-kielessä

Ensin näytämme lyhyen esimerkin, joka ha­vain­nol­lis­taa instanceof:n toimintaa Java-kielessä. Tässä luomme luokan nimeltä “Animal”.

public class Animal {
}
java

Seuraava vaihe on laajentaa tätä luokkaa ala­luo­kal­la nimeltä “Cat”.

public class Cat extends Animal {
}
java

Nyt voimme käyttää Java instanceof tar­kis­taak­sem­me, kuuluuko Cat-instanssi Animal-luokkaan. Tätä varten kir­joi­tam­me muutaman rivin koodia lisää ja tu­los­tam­me tuloksen Java-ko­men­nol­la 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

Tuloksen pitäisi näyttää tältä:

true
java

Useita tasoja ja Object-luokka

Tämä periaate toimii myös Main-luokan ja muiden ala­luok­kien kanssa. Seuraava esimerkki sisältää useita tasoja, ja olemme laa­jen­ta­neet Java-kielessä käy­tet­tä­vän instanceof if-else. Saatat huomata, että kahden kaut­ta­vii­van (//) jälkeen on lisätty tekstiä. Nämä ovat Java-kom­ment­te­ja. Ne se­lit­tä­vät yk­sit­täi­siä vaiheita, mutta eivät vaikuta tulokseen.

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

Esi­mer­kis­täm­me näemme, että cat1 on Cat-luokan ja Animal-yliluokan instanssi. Näin ollen vastaus molempiin ky­se­lyi­hin on ”true”. Koska Object eli luokka java.lang.Object on hie­rar­kian huipulla, cat1 on myös Object-luokan instanssi. Näin ollen Java instanceof -ope­raat­to­ri tuottaa aina tuloksen true, kun sitä käytetään Object-luokan kanssa. Tulos näyttää tältä:

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

Nollan arvoinen tulos

Jos muut­tu­jal­la on nolla-arvo (eli se ei sisällä objektia), Java-ope­raat­to­ri instanceof tulostaa au­to­maat­ti­ses­ti arvon “false”. Kat­so­taan­pa, miten tämä toimii seuraavan esimerkin avulla:

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

Tässä ta­pauk­ses­sa tulos on:

cat2 is NOT an instance of Cat
java

Yliluokka/alaluokka

Vaikka ala­luok­kien objektit kuuluvat myös alaluokan vas­taa­viin ylä­luok­kiin, päin­vas­toin ei ole. Seuraava esimerkki auttaa ha­vain­nol­lis­ta­maan tätä luok­ka­hie­rar­kian omi­nai­suut­ta:

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

Tässä ta­pauk­ses­sa tulos on:

Bello is NOT an instance of Cat
java

Yh­teen­so­pi­mat­to­mien tyyppien vir­heil­moi­tus

Jos objektin ja luokan välillä ei ole yhteyttä, näyttöön tulee vir­heil­moi­tus. Ha­vain­nol­lis­tam­me tätä luomalla uuden luokan nimeltä “Dog”, joka kuuluu Animal-yli­luok­kaan, mutta jolla ei ole yhteyttä Cat-luokkaan.

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

Tässä ti­lan­tees­sa saamme vir­heil­moi­tuk­sen, joka kertoo, että Cat- ja Dog-luokkien välillä ei ole yhteyttä. Ilmoitus näyttää tältä:

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

Di­gi­taa­li­ses­ta op­paas­tam­me löydät lisää mie­len­kiin­toi­sia oppaita ja in­for­ma­tii­vi­sia ar­tik­ke­lei­ta Java-kielestä. Löydät vertailun Java- ja Ja­vaSc­ript-kielistä sekä Java- ja Python-kielistä. Voit myös lukea lisää Java-bittien ope­raat­to­reis­ta.

8102f4cb5db1a12f0a1d968db9a3ca79

Siirry pää­va­lik­koon