Java Academy · Pelajaran

Penaipan Naik/Turun dan instanceof

Fahami penaipan naik kepada jenis induk, penaipan turun yang selamat dengan instanceof serta perangkap lazim yang menyebabkan ClassCastException.

Pelajaran 3 daripada 38 langkah

Penaipan Naik/Turun dan instanceof ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 3. 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 3 pelajaran.

Penukaran naik dan turun jenis

Penukaran naik jenis menyimpan objek anak dalam rujukan jenis induk dan sentiasa selamat. Penukaran turun jenis bergerak ke arah yang bertentangan dan memerlukan perhatian. Kami menggunakan semakan jenis untuk memeriksa jenis sebenar semasa masa jalan.

Kod: demonstrasi penukaran naik jenis

Penukaran naik jenis berlaku secara tersirat dan selamat: Dog boleh dikendalikan sebagai Animal. Anda boleh memanggil kaedah yang diisytiharkan pada Animal; versi Dog akan dijalankan semasa masa jalan.

public class Main {
  static class Animal {
    void speak() { System.out.println("Animal sound"); }
  }
  static class Dog extends Animal {
    void speak() { System.out.println("Woof"); }
    void fetch() { System.out.println("Fetch!"); }
  }

  public static void main(String[] args) {
    // Upcasting: Dog stored in an Animal reference (safe, automatic)
    Animal a = new Dog();
    a.speak();  // calls Dog's speak() due to dynamic binding

    // a.fetch(); // Not allowed: reference is Animal, which does not declare fetch
    System.out.println("Upcasting hides Dog-only methods from the reference type.");
  }
}

Mengapa menukar turun jenis?

Anda menukar turun jenis apabila memerlukan kaedah khusus anak seperti fetch(). Ini sepatutnya jarang dilakukan dan perlu disemak dengan teliti. Utamakan penulisan kod berdasarkan kelas induk atau antara muka apabila boleh.

Kod: penukaran turun jenis yang selamat

Gunakan semakan jenis sebelum membuat penukaran. Jika semakan gagal, jangan teruskan penukaran dan pilih laluan lain; ini mengelakkan ClassCastException.

public class Main {
  static class Animal { void speak() { System.out.println("Animal sound"); } }
  static class Dog extends Animal { void speak() { System.out.println("Woof"); } void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { void speak() { System.out.println("Meow"); } }

  public static void main(String[] args) {
    Animal a1 = new Dog();
    Animal a2 = new Cat();

    // Safe downcast using instanceof
    if (a1 instanceof Dog) {
      Dog d = (Dog) a1;
      d.fetch(); // OK
    }

    if (a2 instanceof Dog) {
      Dog d2 = (Dog) a2; // will not run
      d2.fetch();
    } else {
      System.out.println("a2 is not a Dog, skip casting.");
    }
  }
}

Kesilapan lazim

Kesilapan lazim: membuat penukaran tanpa semakan boleh menyebabkan ClassCastException. Kesilapan lain ialah terlalu banyak menggunakan penukaran turun jenis dan bukannya mereka bentuk berdasarkan antara muka. Pastikan penukaran dekat dengan tempat anda memerlukannya dan utamakan polimorfisme.

Kod: penukaran jenis tidak selamat berbanding selamat

Jangan membuat penukaran secara membuta tuli. Jika anda tidak pasti tentang jenis semasa masa jalan, lindungi penukaran dengan semakan jenis dan pilih alternatif yang selamat jika jenis itu tidak sepadan.

public class Main {
  static class Animal { void speak() { System.out.println("Animal"); } }
  static class Dog extends Animal { void fetch() { System.out.println("Fetch!"); } }
  static class Cat extends Animal { }

  public static void main(String[] args) {
    Animal a = new Cat();

    // Bad: direct cast (would throw at runtime)
    // Dog dBad = (Dog) a; // ClassCastException if uncommented

    // Good: check first
    if (a instanceof Dog) {
      Dog d = (Dog) a;
      d.fetch();
    } else {
      System.out.println("Not a Dog; skipping cast.");
    }
  }
}

Semakan penukaran turun jenis

Semakan pantas: Bagaimanakah anda menukar rujukan Animal kepada Dog dengan selamat?

Rumusan

Rumusan: Penukaran naik jenis adalah selamat dan lazim. Penukaran turun jenis memerlukan semakan jenis untuk mengelakkan ranap; utamakan reka bentuk berdasarkan jenis induk atau antara muka untuk mengurangkan penukaran.

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 “Penaipan Naik/Turun dan instanceof” percuma?

Ya — teks penuh “Penaipan Naik/Turun dan 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 3 pelajaran.

Apakah yang akan saya pelajari dalam “Penaipan Naik/Turun dan instanceof”?

Fahami penaipan naik kepada jenis induk, penaipan turun yang selamat dengan instanceof serta perangkap lazim yang menyebabkan 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 3.

Berapa lamakah pelajaran “Penaipan Naik/Turun dan 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. Kelas Abstrak
  2. Antara Muka (Pengenalan dan Perbandingan)
  3. Penaipan Naik/Turun dan instanceof
← Kembali ke Java Academy