JavaRush /Blog Java /Random-MS /Instanceof operator di Jawa

Instanceof operator di Jawa

Diterbitkan dalam kumpulan
hello! Hari ini kita akan bercakap tentang instanceof operator, lihat contoh penggunaannya dan sentuh beberapa perkara yang berkaitan dengan operasinya :) Pada peringkat awal JavaRush, anda telah pun menemui operator ini. Adakah anda ingat mengapa ia diperlukan? Jika tidak, tidak mengapa, sama-sama kita ingat. Operator instanceof diperlukan untuk menyemak sama ada objek yang dirujuk oleh pembolehubah X telah dicipta daripada beberapa kelas Y. Bunyi mudah. Mengapa kita kembali kepada topik ini? Pertama sekali, kerana sekarang anda sudah mengetahui mekanisme pewarisan dalam Java dan prinsip OOP yang lain. Topik instanceof akan menjadi lebih jelas dan kami akan melihat kes penggunaan yang lebih maju. Pergi! Bagaimanakah pengendali Instanceof berfungsi - 1Anda mungkin ingat bahawa pengendali instanceof mengembalikan benar jika ujian itu benar, atau palsu jika hasilnya salah. Akibatnya, ia paling kerap ditemui dalam pelbagai jenis keadaan ujian ( if…else). Mari kita mulakan dengan 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 dikeluarkan kepada konsol? Nah, ia jelas di sini :) Objeknya хialah Integer, jadi hasilnya akan menjadi benar . Output konsol: benar Mari cuba semak sama ada ia tergolong dalam String:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String);// error!
   }
}
Kami menerima ralat. Dan perhatikan: pengkompil mengeluarkannya sebelum kod itu dilaksanakan! Dia segera melihat bahawa Integer dan String tidak boleh ditukar secara automatik antara satu sama lain dan tidak mempunyai hubungan warisan. Oleh itu, objek kelas Integer tidak akan dibuat daripada String. Ini mudah dan membantu untuk mengelakkan ralat aneh semasa pelaksanaan program, jadi pengkompil membantu kami di sini :) Sekarang mari cuba lihat contoh yang lebih kompleks. Memandangkan kita menyebut warisan, 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 instanceof berkelakuan apabila kita menyemak sama ada objek tergolong dalam kelas dalam situasi biasa, tetapi apakah yang berlaku jika kita menambah perhubungan ibu bapa-anak di sini? Bagaimanakah pengendali Instanceof berfungsi - 2 Sebagai contoh, apakah yang anda fikir semakan berikut 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 sebenarnya instanceof menguraikan konsep "objek yang dicipta berdasarkan kelas"? Akibatnya, kami mendapatnya Сat instanceof Animal == true, tetapi seseorang boleh mencari kesalahan dengan formulasi sedemikian. Mengapa objek ini Catdicipta berdasarkan kelas Animal? Bukankah ia hanya dicipta berdasarkan kelasnya sendiri? Jawapannya agak mudah, dan anda mungkin sudah mengetahuinya. Ingat susunan pembina dipanggil dan pembolehubah dimulakan semasa mencipta objek. Kami telah membincangkan topik ini dalam artikel tentang pembina kelas . Berikut ialah contoh daripada 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 dalam IDE, output konsol akan kelihatan seperti ini: Pembina kelas asas Haiwan sedang berjalan. Adakah pembolehubah kelas Haiwan telah dimulakan? Nilai semasa pembolehubah statik animalCount = 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 Pembina kelas Haiwan asas telah menyelesaikan kerjanya! Nilai semasa otak = Otak Nilai semasa jantung = Jantung Pembina kelas Cat telah mula berfungsi (pembina Haiwan telah pun dilaksanakan) Nilai semasa kucing pembolehubah statikCount = 37 Nilai semasa ekor = Nilai awal ekor dalam Kelas kucing Nilai semasa ekor = Ekor Adakah anda masih ingat sekarang? :) Pembina kelas asas, jika ada, sentiasa dipanggil dahulu apabila mencipta sebarang objek. Instanceof mengikut prinsip ini apabila ia cuba menentukan sama ada objek dicipta Аdaripada kelas Б. Jika pembina kelas asas dipanggil, maka tidak ada keraguan. Dengan pemeriksaan kedua semuanya lebih mudah:
System.out.println(cat instanceof MaineCoon);
Pembina MaineCoontidak dipanggil semasa mencipta Cat, yang logik. Lagipun, MaineCoondia adalah keturunan Cat, bukan moyang. Tetapi Catia bukan templat untuk. Ok, ini nampak jelas. Apa yang akan 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...ini lagi rumit. Cuba kita beri alasan. Kami mempunyai pembolehubah jenis Cat, dan kami telah menetapkan objek jenis kepadanya MaineCoon. Ngomong-ngomong, mengapa ini berfungsi? Adakah mungkin untuk melakukan ini? boleh. Lagipun, mana-mana Maine Coon adalah kucing. Jika tidak jelas sepenuhnya, ingat contoh dengan sambungan jenis primitif:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
Nombor 1024 adalah pendek : ia mudah sesuai dengan pembolehubah panjang , kerana bilangan bait sudah cukup untuknya (ingat contoh dengan anak patung bersarang?). Objek kanak-kanak sentiasa boleh diberikan kepada pembolehubah nenek moyang. Ingat ini buat masa ini, dan dalam kuliah seterusnya kita akan menganalisis proses ini dengan lebih lanjut. Jadi apakah 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 disemak instanceof: pembolehubah kelas kami Catatau objek kelas kami MaineCoon? Sebenarnya, jawapan kepada soalan ini adalah mudah. Anda hanya perlu membaca definisi operator kami sekali lagi: Operator instanceof diperlukan untuk menyemak sama ada objek yang dirujuk oleh pembolehubah telah Xdibuat berdasarkan beberapa kelas Y. Operator instanceof menyemak asal objek, bukan pembolehubah. Oleh itu, dalam contoh, kedua-dua kali ia akan dipaparkan benar dalam konsol : kita mempunyai objek jenis MaineCoon. Sememangnya, ia dicipta berdasarkan kelas MaineCoon, tetapi juga berdasarkan kelas induk Catjuga!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION