logo

Java-instanssi

  1. java instanceof
  2. Esimerkki operaattorin esiintymästä
  3. Kun käytetään instanceof-operaattoria muuttujalla the have nolla-arvo
  4. Downcasting instanceof-operaattorilla
  5. Alaslähetys ilman operaattorin esiintymää

The java instanceof-operaattori käytetään testaamaan, onko objekti tietyn tyyppinen esiintymä (luokka tai alaluokka tai liitäntä).

Java-instanssi tunnetaan myös nimellä tyyppi vertailuoperaattori koska se vertaa esiintymää tyyppiin. Se palauttaa joko tosi tai epätosi. Jos käytämme instanceof-operaattoria mihin tahansa muuttujaan, jolla on nolla-arvo, se palauttaa false.

logo java

Yksinkertainen esimerkki java instanceofista

Katsotaanpa yksinkertainen esimerkki ilmentymäoperaattorista, jossa se testaa nykyistä luokkaa.

 class Simple1{ public static void main(String args[]){ Simple1 s=new Simple1(); System.out.println(s instanceof Simple1);//true } } 
Testaa nyt
 Output:true 

Alaluokkatyypin objekti on myös emoluokan tyyppi. Esimerkiksi, jos Koira laajentaa Animal, niin Dog-objektiin voidaan viitata joko koira- tai eläinluokalla.

Toinen esimerkki java instanceof-operaattorista

 class Animal{} class Dog1 extends Animal{//Dog inherits Animal public static void main(String args[]){ Dog1 d=new Dog1(); System.out.println(d instanceof Animal);//true } } 
Testaa nyt
 Output:true 

instanceof javassa muuttujan kanssa, jolla on nolla-arvo

Jos käytämme instanceof-operaattoria muuttujalla, jolla on nolla-arvo, se palauttaa false. Katsotaanpa alla olevaa esimerkkiä, jossa käytämme instanceof-operaattoria muuttujalla, jolla on nolla-arvo.

 class Dog2{ public static void main(String args[]){ Dog2 d=null; System.out.println(d instanceof Dog2);//false } } 
Testaa nyt
 Output:false 

Alaslähetys java instanceof-operaattorilla

Kun alaluokkatyyppi viittaa yläluokan objektiin, sitä kutsutaan alaslaskuksi. Jos suoritamme sen suoraan, kääntäjä antaa käännösvirheen. Jos suoritat sen typecastingilla, ClassCastException heitetään suorituksen aikana. Mutta jos käytämme instanceof-operaattoria, downcasting on mahdollista.

 Dog d=new Animal();//Compilation error 

Jos suoritamme alaslähetyksen typecastingin avulla, ClassCastException heitetään suorituksen aikana.

kevät ja kevät mvc
 Dog d=(Dog)new Animal(); //Compiles successfully but ClassCastException is thrown at runtime 

Mahdollisuus downcasting instanceofilla

Katsotaanpa esimerkkiä, jossa downcasting on mahdollista instanceof-operaattorilla.

 class Animal { } class Dog3 extends Animal { static void method(Animal a) { if(a instanceof Dog3){ Dog3 d=(Dog3)a;//downcasting System.out.println('ok downcasting performed'); } } public static void main (String [] args) { Animal a=new Dog3(); Dog3.method(a); } } 
Testaa nyt
 Output:ok downcasting performed 

Downcasting ilman Java instanceofin käyttöä

Alaslähetys voidaan suorittaa myös ilman instanceof-operaattorin käyttöä seuraavan esimerkin mukaisesti:

 class Animal { } class Dog4 extends Animal { static void method(Animal a) { Dog4 d=(Dog4)a;//downcasting System.out.println('ok downcasting performed'); } public static void main (String [] args) { Animal a=new Dog4(); Dog4.method(a); } } 
Testaa nyt
 Output:ok downcasting performed 

Katsotaanpa tarkemmin tätä varsinaista objektia, johon viittaa a, on Dog-luokan objekti. Joten jos hylkäämme sen, se on hyvä. Mutta mitä tapahtuu, jos kirjoitamme:

 Animal a=new Animal(); Dog.method(a); //Now ClassCastException but not in case of instanceof operator 

Instanssin todellisen käytön ymmärtäminen Javassa

Katsotaanpa avainsanan instanceof todellista käyttöä alla olevan esimerkin avulla.

 interface Printable{} class A implements Printable{ public void a(){System.out.println('a method');} } class B implements Printable{ public void b(){System.out.println('b method');} } class Call{ void invoke(Printable p){//upcasting if(p instanceof A){ A a=(A)p;//Downcasting a.a(); } if(p instanceof B){ B b=(B)p;//Downcasting b.b(); } } }//end of Call class class Test4{ public static void main(String args[]){ Printable p=new B(); Call c=new Call(); c.invoke(p); } } 
Testaa nyt
 Output: b method