instanceof-operaattori
Käytä instanceof-operaattoria olioiden tyyppien tarkistamiseen ennen tyyppimuunnosta ja vältä ClassCastException-poikkeus.
instanceof-operaattori on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.
instanceof-operaattori
instanceof-operaattori tarkistaa ajonaikaisesti, onko olio tietyn tyypin ilmentymä. Se palauttaa true tai false ja estää ClassCastException-poikkeuksen ennen tyyppimuunnosta.
instanceof-operaattorin perusteet
Käyttäkää instanceof-operaattoria olion ajonaikaisen tyypin tarkistamiseen ennen turvallisen tyyppimuunnoksen tekemistä.
Object obj = "Hello, Java!";
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.toUpperCase()); // HELLO, JAVA!
}
Object num = Integer.valueOf(42);
System.out.println(num instanceof Integer); // true
System.out.println(num instanceof String); // falseinstanceof ja periytyminen
instanceof palauttaa true, jos olio on luokan tai minkä tahansa aliluokan ilmentymä (tai toteuttaa kyseisen rajapinnan).
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
Animal a = new Dog();
System.out.println(a instanceof Animal); // true
System.out.println(a instanceof Dog); // true
System.out.println(a instanceof Cat); // falseinstanceof-kuvionsovitus (Java 16+)
Java 16 toi instanceof-operaattoriin kuvionsovituksen: sidontamuuttujan voi määrittää samassa lausekkeessa, jolloin eksplisiittistä tyyppimuunnosta ei tarvita.
Object shape = "circle";
// Old way
if (shape instanceof String) {
String s = (String) shape;
System.out.println(s.length());
}
// New way (Java 16+) — binding variable 's' is in scope
if (shape instanceof String s) {
System.out.println(s.length()); // 6
}Kuvionsovitus metodissa
Kuvionsovitus tekee tyyppiin perustuvasta käsittelystä selkeää ja turvallista. Sidontamuuttuja on näkyvissä vain siinä kohdassa, jossa ehdon tiedetään olevan tosi.
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
static double area(Shape s) {
if (s instanceof Circle c) {
return Math.PI * c.radius() * c.radius();
} else if (s instanceof Rectangle r) {
return r.width() * r.height();
}
throw new IllegalArgumentException("Unknown shape");
}
System.out.println(area(new Circle(5))); // 78.53...
System.out.println(area(new Rectangle(4, 6))); // 24.0instanceof ja null
null instanceof AnyType palauttaa aina false — se ei koskaan heitä poikkeusta. Siksi instanceof on null-turvallinen tapa tarkistaa tyyppi ennen tyyppimuunnosta.
String s = null;
System.out.println(s instanceof String); // false (not NPE)
Object o = null;
if (o instanceof Number n) {
System.out.println(n.intValue());
} else {
System.out.println("Not a number (or null)"); // prints this
}Switch-lausekkeet ja kuvionsovitus
Java 21 laajentaa kuvionsovituksen switch-lausekkeisiin, joten tyyppiin perustuva reititys onnistuu selkeästi ilman ketjutettuja if-else-rakenteita.
static String describe(Object obj) {
return switch (obj) {
case Integer i -> "Integer: " + i;
case Double d -> "Double: " + d;
case String s -> "String of length " + s.length();
case null -> "null value";
default -> "Unknown: " + obj.getClass().getSimpleName();
};
}
System.out.println(describe(42)); // Integer: 42
System.out.println(describe(3.14)); // Double: 3.14
System.out.println(describe("hello")); // String of length 5
System.out.println(describe(null)); // null valueClassCastException ilman instanceof-operaattoria
Tyyppimuunnos ilman edeltävää tarkistusta johtaa ajonaikaiseen ClassCastException-poikkeukseen — tämä on yleinen virhe vanhassa koodissa, jonka kuvionsovitus auttaa estämään.
Object obj = "I am a String";
try {
Integer i = (Integer) obj; // ClassCastException!
} catch (ClassCastException e) {
System.out.println("Cannot cast String to Integer");
}
// Safe version
if (obj instanceof Integer i) {
System.out.println("Is integer: " + i);
} else {
System.out.println("Not an integer");
}Käytännössä: sekalaisen listan käsittely
Käytännön käyttötapaus on heterogeenisen oliolistan käsittely kuvionsovituksen avulla.
import java.util.List;
List<Object> events = List.of(
"User login", 42, 3.14, "Payment processed", 100
);
double numericSum = 0;
for (Object e : events) {
if (e instanceof Integer n) numericSum += n;
else if (e instanceof Double d) numericSum += d;
else if (e instanceof String s) System.out.println("Log: " + s);
}
System.out.printf("Numeric sum: %.2f%n", numericSum); // 145.14Sealed-luokat ja kattava kuvionsovitus
Sealed-luokat (Java 17+) rajoittavat, mitkä luokat voivat periä niitä. Kun niitä käytetään yhdessä kuvionsovitusta hyödyntävän switch-lausekkeen kanssa, kääntäjä voi tarkistaa kattavuuden — oletustapausta ei tarvita.
sealed interface Notification permits EmailNotification, SmsNotification {}
record EmailNotification(String to, String body) implements Notification {}
record SmsNotification(String phone, String text) implements Notification {}
static void send(Notification n) {
switch (n) {
case EmailNotification e ->
System.out.println("Email to " + e.to() + ": " + e.body());
case SmsNotification s ->
System.out.println("SMS to " + s.phone() + ": " + s.text());
// no default needed — compiler knows all cases are covered
}
}Ehdolliset kuviot
Kuvionsovitus tukee suojausehtoja when-avainsanalla (Java 21), joten tyyppitarkistusten yhteyteen voi lisätä totuusarvoisia ehtoja.
static String classify(Number n) {
return switch (n) {
case Integer i when i < 0 -> "negative int: " + i;
case Integer i when i == 0 -> "zero";
case Integer i -> "positive int: " + i;
case Double d -> "double: " + d;
default -> "other number";
};
}
System.out.println(classify(-5)); // negative int: -5
System.out.println(classify(0)); // zero
System.out.println(classify(7)); // positive int: 7Pikakysymys
Mitä seuraava lauseke palauttaa?
Object obj = null; boolean result = obj instanceof String; System.out.println(result);
Kertaus: instanceof-operaattori
Keskeiset opit:
- instanceof tarkistaa ajonaikaisen tyypin ja estää ClassCastException-poikkeuksen
- Palauttaa null-arvolle false — ei koskaan heitä NPE-poikkeusta
- Palauttaa true luokalle itselleen sekä kaikille sen aliluokille ja toteutetuille rajapinnoille
- Java 16+: kuvionsovitus `if (x instanceof String s)` yhdistää tarkistuksen ja tyyppimuunnoksen
- Java 21:n kuvioita käyttävä switch reitittää arvot siististi tyypin perusteella ja tukee valinnaisia suojausehtoja
- Sealed-luokat ja kattava switch poistavat oletustapauksen tarpeen
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 104
- Oppitunnit
- 374
Usein kysytyt kysymykset
Onko oppitunti ”instanceof-operaattori” ilmainen?
Kyllä – oppitunnin ”instanceof-operaattori” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”instanceof-operaattori”?
Käytä instanceof-operaattoria olioiden tyyppien tarkistamiseen ennen tyyppimuunnosta ja vältä ClassCastException-poikkeus. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”instanceof-operaattori”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?
Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Primitiivityypit ja viitetyypit
- Laajentavat ja supistavat muunnokset
- instanceof-operaattori
- Tyyppimuunnokset käytännössä