# Kako deluje Java operator instanceof

Z operacijo Java `instanceof` lahko preverite, ali objekt pripada določeni razred. Operacija vrne odgovor v obliki booleanske izjave, tj. »true« ali »false«. Če vnaprej preverite, ali se objekt in razred ujemata, lahko preprečite poznejša sporočila o napakah.

## Kaj je `instanceof` v Javi?

Narava nekaterih spremenljivk v Javi ni vedno takoj očitna. V velikih Java projektih z več spremenljivkami lahko na primer vhodni podatki povzročijo, da se spremenljivka prikaže kot različni objekti. Zato programski jezik uporabnikom ponuja `instanceof`. Ta Java operator zagotavlja, da **primerka** referenčne spremenljivke res ustreza razredu, podrazredu ali vmesniku. Če obstaja ujemanje, operator izpiše logično vrednost »true«. Če ujemanja ni, je izpis »false«.

Pri pretvarjanju neznanega objekta je pomembno, da uporabite Java `instanceof`, da se prepričate, da objekt pripada predvideni razred. Če preskočite to varnostno preverjanje, se lahko pojavi **ClassCastException**. To se zgodi, ko je treba objekt pretvoriti v drug razred. Napaka je lahko zavajajoča in lahko povzroči težave, če je koda posebej dolga. Zato je najbolje, da za zaščito že na začetku uporabite Java `instanceof`.

## Kakšna je sintaksa za `instanceof`?

Ko v Javi uporabite `instanceof`, operator **primerja referenčno spremenljivko s specifično razredom**, ki **ga** prav tako določi uporabnik. Ne vključuje nobenih dodatnih informacij o naravi objekta ali razreda. Preprosto ugotovi, ali obstaja ujemanje ali ne. Sintaksa je preprosta in izgleda takole:

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

Če je `(object)` primer `(class)`, se prikaže »true«. Če to ni primer, se prikaže »false«.

## Primeri `instanceof` operatorja v Javi

Najprej vam bomo pokazali kratek primer, ki prikazuje, kako deluje `instanceof` v Javi. Tukaj bomo ustvarili razred z imenom »Animal«.

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

Naslednji korak je razširitev te razreda s podrazredom imenovanim »Cat«.

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

Sedaj lahko z Java `instanceof` preverimo, ali primerka Cat pripada razredu Animal. Za to bomo napisali še nekaj vrstic kode in izpisali rezultat z Java ukazom `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);
}
}
```

Izhod naj bi bil takšen:

```java
true
```

### Več ravni in razred Object

To načelo velja tudi za razred Main in druge podrazrede. Naslednji primer vsebuje več ravni, operater `instanceof` v Javi pa smo razširili z `if-else`. Morda boste opazili nekaj dodatnega besedila za dvema poševnicama (//). To so [komentarji v Javi](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/java-komentarji/). Pojasnjujejo posamezne korake, vendar ne vplivajo na izhod.

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

Če pogledamo naš primer, vidimo, da je cat1 primer razreda Cat in nadrazreda Animal. Zato je odgovor na obe vprašanji »true«. Ker je Object ali razred `java.lang.Object` na vrhu hierarhije, je cat1 tudi primer Object. Zato bo operator Java `instanceof` vedno izpisal true, ko se uporabi z razredom Object. Izpis je takšen:

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

### Izhod z vrednostjo null

Če ima spremenljivka vrednost null (tj. ne vsebuje objekta), Java operator `instanceof` samodejno izpiše »false«. Poglejmo, kako to deluje, na naslednjem primeru:

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

Izhod v tem primeru je:

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

### Nadrazred/podrazred

Čeprav objekti v podrazredih pripadajo tudi ustreznim nadrazredom podrazredov, to ne velja v obratni smeri. Naslednji primer pomaga ponazoriti ta vidik hierarhije razredov:

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

Izhod v tem primeru je:

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

### Napaka zaradi nezdružljivih tipov

Če med objektom in razredom ni povezave, se prikaže poročilo o napaki. Da bi to ponazorili, ustvarimo nov razred z imenom »Dog«, ki pripada nadrazredu Animal, vendar nima povezave z razredom Cat.

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

V tem primeru bomo prejeli sporočilo o napaki, ki nam bo sporočilo, da med razredoma Cat in Dog ni povezave. Sporočilo je videti takole:

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

Tip V našem digitalnem vodniku boste našli še več zanimivih navodil in informativnih člankov o Javi. Najdete primerjavo med [Javo in JavaScriptom](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/java-proti-javascript/) ter med [Javo in Pythonom](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/python-proti-javi/). Izvedeli boste tudi več o [bitnih operatorjih v Javi](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/bitni-operaterji-v-javi/).


This is a markdown version of: [https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/java-operator-instanceof/](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/java-operator-instanceof/) for AI/LLM consumption.