Java Academy · Pelajaran

Operator instanceof

Gunakan instanceof untuk menyemak jenis objek sebelum melakukan penukaran dan mengelakkan ClassCastException.

Pelajaran 3 daripada 413 langkah

Operator instanceof ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Operator instanceof

Operator instanceof menyemak sama ada objek ialah tika bagi jenis tertentu semasa pelaksanaan. Operator ini mengembalikan true atau false dan mencegah ClassCastException sebelum penukaran jenis dilakukan.

Penggunaan Asas instanceof

Gunakan instanceof untuk menguji jenis objek semasa pelaksanaan sebelum melakukan penukaran jenis yang selamat.

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);  // false

instanceof dengan Pewarisan

instanceof mengembalikan true jika objek ialah tika bagi kelas tersebut atau mana-mana subkelas (atau mana-mana antara muka yang dilaksanakan).

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);    // false

Padanan Corak instanceof (Java 16+)

Java 16 memperkenalkan padanan corak untuk instanceof: anda boleh mengisytiharkan pemboleh ubah pengikatan dalam ungkapan yang sama, sekali gus menghapuskan penukaran jenis secara eksplisit.

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
}

Padanan Corak dalam Kaedah

Padanan corak menjadikan pemilihan berdasarkan jenis lebih kemas dan selamat. Pemboleh ubah pengikatan hanya berada dalam skop apabila syarat diketahui benar.

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.0

instanceof dengan null

null instanceof AnyType sentiasa mengembalikan false — ia tidak pernah mencetuskan pengecualian. Ini menjadikan instanceof cara yang selamat terhadap null untuk membuat semakan sebelum penukaran jenis.

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
}

Ungkapan switch dan Padanan Corak

Java 21 melanjutkan padanan corak kepada ungkapan switch, membolehkan penghalaan berdasarkan jenis yang kemas tanpa rangkaian if-else.

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 value

ClassCastException tanpa instanceof

Melakukan penukaran jenis tanpa semakan terlebih dahulu menyebabkan ClassCastException semasa pelaksanaan — pepijat biasa dalam kod legasi yang boleh dicegah oleh padanan corak.

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

Amali: Memproses Senarai Campuran

Kes penggunaan sebenar: memproses senarai objek heterogen menggunakan padanan corak.

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.14

Kelas Bersegel dan Padanan Menyeluruh

Kelas bersegel (Java 17+) mengehadkan kelas yang boleh melanjutkannya. Apabila digabungkan dengan switch padanan corak, pengompil boleh mengesahkan kelengkapan semua kes — kes lalai tidak diperlukan.

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
    }
}

Corak Berpengawal

Padanan corak menyokong pengawal dengan when (Java 21) untuk menambah syarat boolean bersama-sama semakan jenis.

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

Semakan Pantas

Apakah yang dikembalikan oleh ungkapan berikut?

Object obj = null;
boolean result = obj instanceof String;
System.out.println(result);

Imbas Kembali: Operator instanceof

Kesimpulan utama:

  • instanceof menyemak jenis semasa pelaksanaan dan mencegah ClassCastException
  • Mengembalikan false untuk null — tidak pernah mencetuskan NPE
  • Mengembalikan true untuk kelas itu sendiri serta semua subkelas dan antara mukanya
  • Padanan corak Java 16+: if (x instanceof String s) menggabungkan semakan dan penukaran jenis
  • switch Java 21 dengan corak menghalakan aliran mengikut jenis dengan pengawal pilihan
  • Kelas bersegel + switch menyeluruh menghapuskan keperluan untuk kes lalai
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Operator instanceof” percuma?

Ya — teks penuh “Operator instanceof” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Operator instanceof”?

Gunakan instanceof untuk menyemak jenis objek sebelum melakukan penukaran dan mengelakkan ClassCastException. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Operator instanceof” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Jenis Primitif berbanding Rujukan
  2. Penukaran Pelebaran dan Penyempitan
  3. Operator instanceof
  4. Penukaran Jenis dalam Amalan
← Kembali ke Java Academy