Operator instanceof
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 31 dari 87.
Pelajaran sebelumnya menunjukkan bahwa downcasting dapat gagal dengan ClassCastException jika object sebenarnya bukan tipe yang kamu gunakan untuk melakukan casting. Operator instanceof mengatasi hal ini dengan memungkinkanmu memeriksa tipe object sebelum melakukan casting.
Sintaksnya sederhana: object instanceof ClassName menghasilkan true jika object tersebut merupakan instance dari class itu (atau subclass mana pun):
Animal animal = new Dog();
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark(); // Aman untuk memanggil method khusus Dog
}Pemeriksaan ini mencegah error saat runtime dengan memastikan cast berhasil. Operator ini juga mengembalikan true untuk tipe induk dalam hierarki:
Dog dog = new Dog();
System.out.println(dog instanceof Dog); // true
System.out.println(dog instanceof Animal); // true
System.out.println(dog instanceof Object); // trueSejak Java 16, kamu bisa menggabungkan pemeriksaan dan cast dalam satu langkah menggunakan pencocokan pola:
if (animal instanceof Dog dog) {
dog.bark(); // 'dog' sudah dikonversi tipenya dan siap digunakan
}Sintaks yang lebih ringkas ini menghilangkan baris cast yang terpisah. Perhatikan bahwa instanceof menghasilkan false saat diuji terhadap null, jadi kamu tidak perlu melakukan pemeriksaan null secara terpisah.
Tantangan
MudahMari buat sistem inspeksi kendaraan yang menggunakan operator instanceof untuk mengidentifikasi dan menangani berbagai tipe kendaraan dengan aman. Kamu akan membuat hierarki kendaraan dan menulis kode yang memeriksa tipe sebenarnya setiap kendaraan sebelum mengakses fitur khususnya.
Kamu akan menyusun kodemu dalam empat file:
Vehicle.java: Buat class dasar yang digunakan bersama oleh semua kendaraan. Setiap kendaraan memiliki fieldmodel(String). Sertakan konstruktor untuk menginisialisasinya, method gettergetModel(), dan methodinspect()yang mencetak:Inspecting vehicle: [model]Car.java: Buat class yang memperluas Vehicle. Mobil memiliki field tambahannumDoors(int). Gunakansuperuntuk inisialisasi induk. Tambahkan methodcheckDoors()yang mencetak:[model] has [numDoors] doorsMotorcycle.java: Buat class lain yang memperluas Vehicle. Sepeda motor memiliki fieldhasSidecar(boolean). Tambahkan methodcheckSidecar()yang mencetak[model] has a sidecaratau[model] has no sidecar, bergantung pada nilai boolean.Main.java: Di sinilahinstanceofmenjadi penting! Kamu akan menerima empat input: model mobil, jumlah pintu, model sepeda motor, dan apakah kendaraan itu memiliki sespan (true/false).Buat array berisi referensi
Vehicleyang mencakup satu Car dan satu Motorcycle. Lalu lakukan perulangan melalui array tersebut, dan untuk setiap kendaraan:- Panggil method dasar
inspect() - Gunakan
instanceofuntuk memeriksa apakah itu Car. Jika ya, lakukan downcast dengan aman dan panggilcheckDoors() - Gunakan
instanceofuntuk memeriksa apakah itu Motorcycle. Jika ya, lakukan downcast dengan aman dan panggilcheckSidecar()
- Panggil method dasar
Kamu akan menerima empat input: model mobil (String), jumlah pintu (int), model sepeda motor (String), dan apakah sepeda motor memiliki sespan (boolean).
Output-mu harus menampilkan empat baris. Untuk setiap kendaraan, kamu akan melihat pesan inspeksinya diikuti pemeriksaan khusus tipenya. Operator instanceof memastikan bahwa kamu hanya memanggil method Car pada Car yang sebenarnya dan method Motorcycle pada Motorcycle yang sebenarnya, sehingga mencegah ClassCastException!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca input
String carModel = scanner.nextLine();
int numDoors = Integer.parseInt(scanner.nextLine());
String motorcycleModel = scanner.nextLine();
boolean hasSidecar = Boolean.parseBoolean(scanner.nextLine());
// TODO: Buat object Car dengan carModel dan numDoors
// TODO: Buat object Motorcycle dengan motorcycleModel dan hasSidecar
// TODO: Buat array referensi Vehicle yang berisi Car dan Motorcycle
// TODO: Lakukan perulangan pada array, lalu untuk setiap kendaraan:
// 1. Panggil method inspect()
// 2. Gunakan instanceof untuk memeriksa apakah kendaraan tersebut Car, lalu lakukan downcast dan panggil checkDoors()
// 3. Gunakan instanceof untuk memeriksa apakah kendaraan tersebut Motorcycle, lalu lakukan downcast dan panggil checkSidecar()
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online