CodeGym /Blog Java /rawak /Java instanceof Operator
John Squirrels
Tahap
San Francisco

Java instanceof Operator

Diterbitkan dalam kumpulan
Hai! Hari ini kita akan bercakap tentang pengendali instanceof , pertimbangkan contoh cara ia digunakan dan menyentuh beberapa aspek cara ia berfungsi:) Anda telah pun menemui operator ini pada peringkat awal CodeGym. Adakah anda ingat mengapa kita memerlukannya? Jika tidak, jangan risau. Sama-sama kita ingat. Pengendali instanceof diperlukan untuk menyemak sama ada objek yang dirujuk oleh pembolehubah X dicipta berdasarkan beberapa kelas Y. Itu kedengaran mudah. Mengapa kita kembali kepada topik ini? Pertama sekali, kerana sekarang anda sudah mengetahui dengan baik mekanisme warisan Java dan prinsip lain OOP. Pengendali instanceof kini akan menjadi lebih jelas dan kami akan melihat contoh yang lebih lanjut tentang cara ia digunakan. Mari pergi!Bagaimana instanceof operator berfungsi - 1Anda mungkin ingat bahawa operator instanceof mengembalikan benar jika semakan dinilai kepada benar, atau palsu jika ungkapan itu palsu. Oleh itu, ia biasanya berlaku dalam semua jenis ungkapan bersyarat ( if…else ). Mari kita mulakan dengan beberapa contoh yang lebih mudah:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Apa yang anda fikir akan dipaparkan pada konsol? Nah, ia jelas di sini.:) Objek x ialah Integer, jadi hasilnya akan menjadi benar . Output konsol: Benar Mari cuba semak sama ada ia String :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Kami mendapat ralat. Dan perhatikan: pengkompil menghasilkan ralat sebelum menjalankan kod! Ia serta-merta melihat bahawa Integer dan String tidak boleh ditukar secara automatik antara satu sama lain dan tidak berkaitan melalui pewarisan. Akibatnya, objek Integer tidak dibuat berdasarkan String . Ini mudah dan membantu mengelakkan ralat masa jalan yang pelik, jadi pengkompil membantu kami di sini :) Sekarang mari cuba pertimbangkan contoh yang lebih sukar. Oleh kerana kita menyebut warisan, mari kita bekerja dengan sistem kelas kecil berikut:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Kita sudah tahu bagaimana instanceof berkelakuan apabila kita menyemak sama ada objek ialah contoh kelas, tetapi apakah yang berlaku jika kita mempertimbangkan hubungan ibu bapa-anak? Sebagai contoh, apakah yang anda fikir ungkapan ini akan menghasilkan:

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

   }
}
Output: True False Soalan utama yang perlu dijawab ialah bagaimana instanceof mentafsir 'objek yang dibuat berdasarkan kelas'? ' cat instanceof Animal ' menilai benar , tetapi pastinya kita boleh mencari kesalahan dengan perkataan itu. Mengapa objek Cat dicipta berdasarkan kelas Haiwan ? Bukankah ia dicipta berdasarkan kelasnya sendiri sahaja? Jawapannya cukup mudah, dan anda mungkin sudah memikirkannya. Ingat susunan pembina dipanggil dan pembolehubah dimulakan semasa mencipta objek. Kami telah membincangkan topik ini dalam artikel tentang pembina kelas . Berikut ialah contoh daripada 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 dalam IDE, output konsol akan kelihatan seperti ini: Pembina kelas asas haiwan sedang berjalan Adakah pembolehubah kelas Haiwan telah dimulakan? Nilai semasa haiwan pembolehubah statikCount = 7700000 Nilai semasa otak dalam kelas Haiwan = Nilai awal otak dalam kelas Haiwan Nilai semasa jantung dalam kelas Haiwan = Nilai awal jantung dalam kelas Haiwan Mempunyai pembolehubah kelas Kucing sudah telah dimulakan? Nilai semasa pembolehubah statik catCount = 37 Pembina kelas asas haiwan selesai! Nilai semasa otak = Otak Nilai semasa jantung = Jantung Pembina kelas kucing telah bermula (Pembina Haiwan sudah selesai) Nilai semasa pembolehubah statik catCount = 37 Nilai semasa ekor = Nilai awal ekor dalam kelas Kucing Nilai semasa ekor = Ekor Sekarang adakah anda ingat? :) Pembina kelas asas, jika terdapat kelas asas, sentiasa dipanggil dahulu apabila mencipta objek. Pengendali instanceof dipandu oleh prinsip ini apabila cuba menentukan sama ada objek A dicipta berdasarkan kelas B. Jika pembina kelas asas dipanggil, maka tidak ada keraguan. Dengan semakan kedua, semuanya lebih mudah:

System.out.println(cat instanceof MaineCoon);
Pembina MaineCoon tidak dipanggil apabila objek Cat dicipta, yang masuk akal. Lagipun, MaineCoon adalah keturunan Cat , bukan nenek moyang. Dan ia bukan templat untuk Cat . Okay, saya rasa kita sudah jelas mengenainya. Tetapi apa yang berlaku 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 itu lebih sukar. Mari kita bincangkannya. Kami mempunyai pembolehubah Cat yang kami berikan objek MaineCoon . Ngomong-ngomong, mengapa ia berfungsi? Kita boleh melakukannya, bukan? Ya kita boleh. Lagipun, setiap MaineCoon adalah kucing. Jika itu tidak sepenuhnya jelas, ingat contoh pelebaran jenis primitif:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Nombor 1024 adalah pendek : ia mudah sesuai dengan pembolehubah yang panjang , kerana terdapat bait yang mencukupi untuk menampungnya (ingat contoh dengan anak patung?). Objek keturunan sentiasa boleh diberikan kepada pembolehubah nenek moyang. Buat masa ini, hanya ingat ini, dan dalam pelajaran seterusnya kita akan menganalisis cara ia berfungsi. Jadi apakah output contoh kami?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
Apakah instanceof check? pembolehubah Kucing kami atau objek MaineCoon kami? Jawapannya ialah soalan ini sebenarnya mudah. Anda hanya perlu membaca definisi operator sekali lagi: Operator instanceof diperlukan untuk menyemak sama ada objek yang dirujuk oleh pembolehubah X dicipta berdasarkan beberapa kelas Y. Operator instanceof menguji asal sesuatu objek, bukan jenis pembolehubah. Oleh itu, dalam contoh ini, program kami akan memaparkan benar dalam kedua-dua kes: kami mempunyai objek MaineCoon . Jelas sekali, ia dicipta berdasarkan kelas MaineCoon , tetapi ia dicipta berdasarkan Catkelas ibu bapa juga!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION