Java-operaattorin instanceof toiminta
Voit käyttää Java-operaattoria instanceof tarkistaaksesi, kuuluuko objekti tiettyyn luokkaan. Operaattori antaa vastauksen boolenilausekkeen muodossa, eli ”true” tai ”false”. Objekti ja luokka voidaan tarkistaa etukäteen, jotta vältytään virheilmoituksilta myöhemmin.
Mikä on instanceof Java-kielessä?
Joidenkin muuttujien luonne Java-kielessä ei aina ole välittömästi ilmeinen. Suurissa Java-projekteissa, joissa on lukuisia muuttujia, esimerkiksi syötetty data voi aiheuttaa sen, että muuttuja näkyy eri objekteina. Siksi ohjelmointikieli tarjoaa käyttäjille instanceof. Tämä Java-operaattori varmistaa, että viittausmuuttujan instanssi todella vastaa luokkaa, alaluokkaa tai rajapintaa. Jos vastaavuus löytyy, operaattori tuottaa boolen arvon “true”. Jos vastaavuutta ei löydy, tulos on “false”.
Kun muunnat tuntemattoman objektin, on tärkeää käyttää Java instanceof varmistaaksesi, että objekti kuuluu oletettuun luokkaan. Jos ohitat tämän turvatarkistuksen, ClassCastException-virhe voi ilmetä. Tämä tapahtuu, kun objekti on muunnettava toiseen luokkaan. Virheilmoitus voi olla hämmentävä ja aiheuttaa ongelmia, jos koodi on erityisen pitkä. Siksi on parasta käyttää Java instanceof varhaisessa vaiheessa suojana.
Mikä on syntaksi numerolle instanceof?
Kun käytät instanceof Java-kielessä, operaattori vertaa viittausmuuttujaa käyttäjän määrittelemään tiettyyn luokkaan. Se ei sisällä lisätietoja objektin tai luokan luonteesta. Se vain määrittää, onko vastaavuutta vai ei. Syntaksi on yksinkertainen ja näyttää tältä:
(object) instanceof (class)javaJos (object) on (class)n tapaus, näytetään ”true”. Jos näin ei ole, näytetään ”false”.
Esimerkkejä instanceof operaattorista Java-kielessä
Ensin näytämme lyhyen esimerkin, joka havainnollistaa instanceof:n toimintaa Java-kielessä. Tässä luomme luokan nimeltä “Animal”.
public class Animal {
}javaSeuraava vaihe on laajentaa tätä luokkaa alaluokalla nimeltä “Cat”.
public class Cat extends Animal {
}javaNyt voimme käyttää Java instanceof tarkistaaksemme, kuuluuko Cat-instanssi Animal-luokkaan. Tätä varten kirjoitamme muutaman rivin koodia lisää ja tulostamme tuloksen Java-komennolla 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);
}
}javaTuloksen pitäisi näyttää tältä:
truejavaUseita tasoja ja Object-luokka
Tämä periaate toimii myös Main-luokan ja muiden alaluokkien kanssa. Seuraava esimerkki sisältää useita tasoja, ja olemme laajentaneet Java-kielessä käytettävän instanceof if-else. Saatat huomata, että kahden kauttaviivan (//) jälkeen on lisätty tekstiä. Nämä ovat Java-kommentteja. Ne selittävät yksittäisiä 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");
}
}javaEsimerkistämme näemme, että cat1 on Cat-luokan ja Animal-yliluokan instanssi. Näin ollen vastaus molempiin kyselyihin on ”true”. Koska Object eli luokka java.lang.Object on hierarkian huipulla, cat1 on myös Object-luokan instanssi. Näin ollen Java instanceof -operaattori 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 ObjectjavaNollan arvoinen tulos
Jos muuttujalla on nolla-arvo (eli se ei sisällä objektia), Java-operaattori instanceof tulostaa automaattisesti arvon “false”. Katsotaanpa, 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");
}
}javaTässä tapauksessa tulos on:
cat2 is NOT an instance of CatjavaYliluokka/alaluokka
Vaikka alaluokkien objektit kuuluvat myös alaluokan vastaaviin yläluokkiin, päinvastoin ei ole. Seuraava esimerkki auttaa havainnollistamaan tätä luokkahierarkian ominaisuutta:
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");
}
}javaTässä tapauksessa tulos on:
Bello is NOT an instance of CatjavaYhteensopimattomien tyyppien virheilmoitus
Jos objektin ja luokan välillä ei ole yhteyttä, näyttöön tulee virheilmoitus. Havainnollistamme tätä luomalla uuden luokan nimeltä “Dog”, joka kuuluu Animal-yliluokkaan, 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);
}
}javaTässä tilanteessa saamme virheilmoituksen, 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 DogjavaDigitaalisesta oppaastamme löydät lisää mielenkiintoisia oppaita ja informatiivisia artikkeleita Java-kielestä. Löydät vertailun Java- ja JavaScript-kielistä sekä Java- ja Python-kielistä. Voit myös lukea lisää Java-bittien operaattoreista.
8102f4cb5db1a12f0a1d968db9a3ca79