JavaRush /Java Blog /Random-ID /Operator instanceof di Java

Operator instanceof di Java

Dipublikasikan di grup Random-ID
Halo! Hari ini kita akan berbicara tentang operator instanceof, melihat contoh penggunaannya dan menyentuh beberapa poin yang terkait dengan operasinya :) Di level awal JavaRush, Anda sudah menemukan operator ini. Apakah Anda ingat mengapa itu diperlukan? Jika belum, tidak masalah, mari kita ingat bersama. Operator instanceof diperlukan untuk memeriksa apakah objek yang direferensikan oleh variabel X dibuat dari beberapa kelas Y. Kedengarannya sederhana. Mengapa kami kembali ke topik ini? Pertama-tama, karena sekarang Anda sudah familiar dengan mekanisme pewarisan di Java dan prinsip OOP lainnya. Topik instanceof akan lebih jelas dan kita akan melihat kasus penggunaan lebih lanjut. Pergi! Bagaimana cara kerja operator Instanceof - 1Anda mungkin ingat bahwa operator instanceof mengembalikan nilai benar jika pengujiannya benar, atau salah jika hasilnya salah. Akibatnya, hal ini paling sering ditemukan dalam berbagai jenis kondisi pengujian ( if…else). Mari kita mulai dengan contoh yang lebih sederhana:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Menurut Anda apa yang akan dihasilkan ke konsol? Nah disini sudah jelas :) Objeknya хadalah Integer, jadi hasilnya akan true . Output konsol: true Mari kita coba periksa apakah itu milik, misalnya, String:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// error!
   }
}
Kami menerima kesalahan. Dan perhatikan: kompiler mengeluarkannya bahkan sebelum kode dieksekusi! Dia segera melihat bahwa Integer dan String tidak dapat secara otomatis dikonversi satu sama lain dan tidak memiliki hubungan warisan. Oleh karena itu, objek kelas Integer tidak akan dibuat dari String. Ini nyaman dan membantu menghindari kesalahan aneh selama eksekusi program, jadi kompiler membantu kami di sini :) Sekarang mari kita coba melihat contoh yang lebih kompleks. Karena kita telah menyebutkan pewarisan, mari kita bekerja dengan sistem kelas kecil ini:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Kita sudah tahu bagaimana perilaku instanceof ketika kita memeriksa apakah suatu objek termasuk dalam kelas dalam situasi normal, tetapi apa yang terjadi jika kita menambahkan hubungan orangtua-anak di sini? Bagaimana cara kerja operator Instanceof - 2 Misalnya, menurut Anda apa yang akan dihasilkan oleh pemeriksaan berikut:
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();

       System.out.println(cat instanceof Animal);

       System.out.println(cat instanceof MaineCoon);

   }
}
Keluaran: benar salah Pertanyaan utama yang perlu dijawab adalah bagaimana tepatnya instanceof menguraikan konsep "objek yang dibuat berdasarkan kelas"? Hasilnya, kami mendapatkannya Сat instanceof Animal == true, tetapi orang dapat menemukan kesalahan dengan formulasi seperti itu. Mengapa objek ini Catdibuat berdasarkan kelas Animal? Bukankah itu hanya dibuat berdasarkan kelasnya sendiri? Jawabannya cukup sederhana, dan Anda mungkin sudah mengetahuinya. Ingat urutan pemanggilan konstruktor dan inisialisasi variabel saat membuat objek. Kami telah membahas topik ini di artikel tentang konstruktor kelas . Berikut ini contoh dari kuliah itu:
public class Animal {

   String brain = "The initial value of brain in the Animal class";
   String heart = "The initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("The constructor of the Animal base class is being executed");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("The current value of the static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in class Animal = " + this.brain);
       System.out.println("Current value of heart in class Animal = " + this.heart);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor completed!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

class Cat extends Animal {

   String tail = "The initial value of tail in the Cat class";

   static int catsCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The constructor of the Cat class has started (the Animal constructor has already been executed)");
       System.out.println("The current value of the static variable catsCount = " + catsCount);
       System.out.println("Current value tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Dan jika Anda menjalankannya di IDE, output konsol akan terlihat seperti ini: Konstruktor kelas dasar Animal sedang berjalan Apakah variabel kelas Animal sudah diinisialisasi? Nilai sekarang dari variabel statis animalCount = 7700000 Nilai sekarang otak di kelas Hewan = Nilai awal otak di kelas Hewan Nilai sekarang hati di kelas Hewan = Nilai awal hati di kelas Hewan Konstruktor dari kelas Hewan dasar telah menyelesaikan tugasnya! Nilai saat ini dari otak = Otak Nilai saat ini dari hati = Hati Konstruktor kelas Cat telah mulai bekerja (konstruktor Hewan telah dijalankan) Nilai saat ini dari variabel statis catCount = 37 Nilai saat ini dari tail = Nilai awal dari ekor di dalam Kelas kucing Nilai ekor saat ini = Ekor Apakah Anda ingat sekarang? :) Konstruktor kelas dasar, jika ada, selalu dipanggil terlebih dahulu saat membuat objek apa pun. Instanceof mengikuti prinsip ini ketika mencoba menentukan apakah suatu objek dibuat Аdari suatu kelas Б. Jika konstruktor kelas dasar dipanggil, maka tidak ada keraguan. Dengan pemeriksaan kedua, semuanya menjadi lebih sederhana:
System.out.println(cat instanceof MaineCoon);
Konstruktor MaineCoontidak dipanggil saat membuat Cat, dan itu logis. Bagaimanapun, MaineCoondia adalah keturunan Cat, bukan nenek moyang. Tapi Catini bukan template untuk. Oke, ini tampak jelas. Apa yang akan terjadi jika kita melakukan ini:
public class Main {

   public static void main(String[] args) {

       Cat cat = new MaineCoon();

       System.out.println(cat instanceof Cat);
       System.out.println(cat instanceof MaineCoon);


   }
}
Hmm...ini lebih rumit. Mari kita coba bernalar. Kita mempunyai variabel bertipe Cat, dan kita telah menugaskan objek bertipe ke dalamnya MaineCoon. Ngomong-ngomong, kenapa ini bisa berhasil? Apakah mungkin melakukan ini? Bisa. Bagaimanapun, Maine Coon mana pun adalah kucing. Jika belum sepenuhnya jelas, ingat contoh dengan ekstensi tipe primitif:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Angka 1024 pendek : mudah dimasukkan ke dalam variabel long , karena jumlah byte cukup untuk itu (ingat contoh boneka bersarang?). Objek anak selalu dapat ditugaskan ke variabel leluhur. Ingatlah hal ini untuk saat ini, dan pada kuliah berikutnya kita akan menganalisis proses ini lebih jauh. Jadi, apa yang akan dihasilkan oleh contoh kita?
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Apa yang akan diperiksa oleh instanceof: variabel kelas kita Catatau objek kelas kita MaineCoon? Sebenarnya jawaban atas pertanyaan ini sederhana. Anda hanya perlu membaca kembali definisi operator kami: Operator instanceof diperlukan untuk memeriksa apakah objek yang direferensikan oleh variabel dibuat Xberdasarkan beberapa kelas Y. Operator instanceof memeriksa asal suatu objek, bukan variabel. Oleh karena itu, dalam contoh, kedua kali akan ditampilkan true di konsol : kita memiliki objek bertipe MaineCoon. Tentu saja, itu dibuat berdasarkan class MaineCoon, tetapi juga berdasarkan class induknya Catjuga!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION