# 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ä:

```java
(object) instanceof (class)
```

Jos `(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”.

```java
public class Animal {
}
```

Seuraava vaihe on laajentaa tätä luokkaa alaluokalla nimeltä “Cat”.

```java
public class Cat extends Animal {
}
```

Nyt 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`:

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

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

```java
true
```

### Useita 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](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-kommentit/). Ne selittävät yksittäisiä vaiheita, mutta eivät vaikuta tulokseen.

```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");
	}
}
```

Esimerkistä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ä:

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

### Nollan 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:

```java
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");
	}
}
```

Tässä tapauksessa tulos on:

```java
cat2 is NOT an instance of Cat
```

### Yliluokka/alaluokka

Vaikka alaluokkien objektit kuuluvat myös alaluokan vastaaviin yläluokkiin, päinvastoin ei ole. Seuraava esimerkki auttaa havainnollistamaan tätä luokkahierarkian ominaisuutta:

```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");
	}
}
```

Tässä tapauksessa tulos on:

```java
Bello is NOT an instance of Cat
```

### Yhteensopimattomien 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.

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

Tässä tilanteessa saamme virheilmoituksen, joka kertoo, että Cat- ja Dog-luokkien välillä ei ole yhteyttä. Ilmoitus näyttää tältä:

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

Vinkki Digitaalisesta oppaastamme löydät lisää mielenkiintoisia oppaita ja informatiivisia artikkeleita Java-kielestä. Löydät vertailun [Java- ja JavaScript-kielistä](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-vs-javascript/) sekä [Java- ja Python-kielistä](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/python-vs-java/). Voit myös lukea lisää [Java-bittien operaattoreista](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-bittitason-operaattorit/).


This is a markdown version of: [https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-operaattori-instanceof/](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-operaattori-instanceof/) for AI/LLM consumption.