CodeGym /Java Blog /Acak /Instance of Operator Java
John Squirrels
Level 41
San Francisco

Instance of Operator Java

Dipublikasikan di grup Acak
Hai! Hari ini kita akan berbicara tentang operator instanceof , pertimbangkan contoh penggunaannya, dan menyentuh beberapa aspek tentang cara kerjanya :) Anda telah menjumpai operator ini di tingkat awal CodeGym. Apakah Anda ingat mengapa kita membutuhkannya? Jika tidak, jangan khawatir. Mari kita ingat bersama. Operator instanceof diperlukan untuk memeriksa apakah objek yang direferensikan oleh variabel X dibuat berdasarkan beberapa kelas Y. Kedengarannya sederhana. Mengapa kita kembali ke topik ini? Pertama-tama, karena sekarang Anda sudah sangat mengenal mekanisme pewarisan Java dan prinsip-prinsip OOP lainnya. Operator instanceof sekarang akan jauh lebih jelas dan kita akan melihat contoh lebih lanjut tentang bagaimana penggunaannya. Ayo pergi!Cara kerja operator instanceof - 1Anda mungkin ingat bahwa operator instanceof mengembalikan true jika pemeriksaan bernilai true, atau false jika ekspresinya false. Oleh karena itu, biasanya muncul di semua jenis ekspresi bersyarat ( if…else ). Mari kita mulai dengan beberapa contoh 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 ditampilkan di konsol? Nah, di sini sudah jelas. :) Objek x adalah Integer, jadi hasilnya akan benar . Keluaran konsol: Benar Mari kita coba periksa apakah itu sebuah String :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Kami mendapat kesalahan. Dan perhatikan: kompiler menghasilkan kesalahan sebelum menjalankan kode! Segera terlihat bahwa Integer dan String tidak dapat secara otomatis dikonversi satu sama lain dan tidak terkait melalui pewarisan. Akibatnya, objek Integer tidak dibuat berdasarkan String . Ini nyaman dan membantu menghindari kesalahan runtime yang aneh, jadi kompiler membantu kami di sini :) Sekarang mari kita coba pertimbangkan contoh yang lebih sulit. Karena kami menyebutkan pewarisan, mari bekerja dengan sistem kelas kecil berikut:

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 adalah instance dari kelas, tetapi apa yang terjadi jika kita mempertimbangkan hubungan orangtua-anak? Misalnya, menurut Anda apa yang akan dihasilkan oleh ekspresi ini:

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 persis bagaimana instanceof menginterpretasikan 'objek yang dibuat berdasarkan kelas'? ' cat instanceof Animal ' dievaluasi menjadi true , tetapi tentunya kita dapat menemukan kesalahan dengan kata-kata itu. Mengapa objek Cat dibuat berdasarkan kelas Hewan ? Bukankah itu dibuat berdasarkan kelasnya sendiri? Jawabannya cukup sederhana, dan Anda mungkin sudah memikirkannya. Ingat urutan pemanggilan konstruktor dan variabel diinisialisasi saat membuat objek. Kami sudah membahas topik ini di artikel tentang class constructors . Berikut adalah contoh dari pelajaran itu:

public class Animal {

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

   public static int animalCount = 7700000;

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

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

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

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

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Dan jika Anda menjalankannya di IDE, keluaran konsol akan terlihat seperti ini: Konstruktor kelas dasar hewan sedang berjalan Apakah variabel kelas Hewan sudah diinisialisasi? Nilai arus variabel statik animalCount = 7700000 Nilai arus otak pada kelas Animal = Nilai awal otak pada kelas Animal Nilai arus jantung pada kelas Animal = Nilai awal jantung pada kelas Animal Sudah memiliki variabel kelas Cat diinisialisasi? Nilai saat ini dari variabel statis catCount = 37 Konstruktor kelas dasar hewan selesai! Nilai saat ini dari brain = Brain Nilai saat ini heart = Heart Konstruktor kelas kucing telah dimulai (Konstruktor Hewan telah selesai) Nilai saat ini dari variabel statis catCount = 37 Nilai saat ini dari tail = Nilai awal dari tail di kelas Cat Nilai saat ini dari tail = Ekor Sekarang apakah Anda ingat? :) Konstruktor dari kelas dasar, jika ada kelas dasar, selalu dipanggil terlebih dahulu saat membuat objek. Operator instanceof dipandu oleh prinsip ini saat mencoba menentukan apakah objek A dibuat berdasarkan kelas B. Jika konstruktor kelas dasar dipanggil, maka tidak diragukan lagi. Dengan pemeriksaan kedua, semuanya menjadi lebih sederhana:

System.out.println(cat instanceof MaineCoon);
Konstruktor MaineCoon tidak dipanggil saat objek Cat dibuat, yang masuk akal. Lagipula, MaineCoon adalah keturunan dari Cat , bukan nenek moyang. Dan itu bukan template untuk Cat . Oke, saya pikir kita sudah jelas tentang itu. Tapi apa yang 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... sekarang lebih sulit. Mari kita bicarakan. Kami memiliki variabel Cat yang kami berikan objek MaineCoon . Ngomong-ngomong, mengapa itu berhasil? Kita bisa melakukan itu, kan? Ya kita bisa. Lagipula, setiap MaineCoon adalah seekor kucing. Jika itu tidak sepenuhnya jelas, ingatlah contoh pelebaran tipe primitif:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Angka 1024 pendek : mudah masuk ke dalam variabel panjang , karena ada cukup banyak byte untuk menampungnya (ingat contoh dengan boneka?) . Objek keturunan selalu dapat ditugaskan ke variabel leluhur. Untuk saat ini, ingat saja ini, dan dalam pelajaran selanjutnya kita akan menganalisis cara kerjanya. Jadi, apa yang dihasilkan oleh contoh kita?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Apa yang akan diperiksa instanceof ? variabel Cat kita atau objek MaineCoon kita ? Jawabannya adalah pertanyaan ini sebenarnya sederhana. Anda hanya perlu membaca kembali definisi operator: Operator instanceof diperlukan untuk memeriksa apakah objek yang direferensikan oleh variabel X dibuat berdasarkan beberapa kelas Y. Operator instanceof menguji asal objek, bukan tipe variabel. Jadi, dalam contoh ini, program kita akan menampilkan true dalam kedua kasus: kita memiliki objek MaineCoon . Jelas, itu dibuat berdasarkan kelas MaineCoon , tetapi dibuat berdasarkan kelas Catkelas orang tua juga!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION