JavaRush /Blog Java /Random-MS /instanceof dan asas pewarisan

instanceof dan asas pewarisan

Diterbitkan dalam kumpulan
hello! Dalam kuliah-kuliah sebelum ini, secara ringkas kita sudah beberapa kali menemui konsep pewarisan. Hari ini kita juga akan menyentuh topik ini, tetapi juga tidak terlalu mendalam. Akan ada kuliah terperinci tentang perkara ini kemudian, tetapi hari ini kita hanya akan melihat contoh praktikal dan berkenalan dengan satu operator menarik di Jawa.

warisan Jawa

Jadi, apakah sebenarnya harta pusaka? contoh dan asas pewarisan - 1Warisan ialah mekanisme dalam pengaturcaraan, termasuk Java, yang membolehkan anda menerangkan kelas baharu berdasarkan kelas sedia ada. Kelas keturunan kemudiannya mendapat akses kepada medan dan kaedah kelas induk. Mengapa ini mungkin perlu? Contohnya, bayangkan anda perlu mencipta beberapa kelas kereta dalam program: Lori, Lumba, Sedan, Pickup, dll. Walaupun tanpa mula menulis kod, anda pasti tahu bahawa kelas ini mempunyai banyak persamaan: semua kereta mempunyai nama model, tahun pembuatan, saiz enjin, kelajuan maksimum, dll. (apatah lagi fakta bahawa mereka semua mempunyai roda dan bahagian lain). Dalam keadaan sedemikian, anda boleh:
  • Cipta medan ini dalam setiap kelas dan tambahkannya pada kelas kereta baharu apabila ia dibuat
  • Alihkan medan biasa kepada semua mesin ke dalam kelas induk Cardan semua kelas jenis mesin tertentu mewarisi daripada Carmenggunakan perkataan extends .
Pilihan kedua, tentu saja, lebih mudah:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Sekurang-kurangnya, kami telah mengelakkan pertindihan kod yang tidak perlu, dan ini adalah sesuatu yang kami harus sentiasa usahakan semasa menulis program. Di samping itu, kami mempunyai struktur kelas yang mudah dan boleh difahami: medan yang biasa untuk semua mesin diletakkan dalam satu kelas. Jika, sebagai contoh, trak mempunyai beberapa medan khusus yang tidak dimiliki oleh kereta lain, ia boleh diisytiharkan dalam kelas Truck. Begitu juga dengan kaedah. Semua kereta mempunyai beberapa tingkah laku biasa yang boleh diterangkan: hidupkan kereta, gas/brek, dsb. Kaedah umum ini boleh diletakkan dalam kelas umum Car, dan tingkah laku khusus setiap jenis khusus boleh diterangkan dalam kelas keturunan.
public class Car {

   public void gas() {
       //...gas
   }

   public void brake() {
       //...brake
   }
}


public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Kami telah memindahkan kaedah biasa semua kereta ke dalam kelas Car. Tetapi dalam kelas pengganti F1Car, yang menerangkan kereta perlumbaan Formula 1 - hentian pit (berhenti untuk penyelenggaraan segera kereta), yang dilakukan hanya dalam perlumbaan dan dibezakan oleh tingkah laku tertentu.

Java instanceof operator

Untuk menyemak sama ada objek dicipta berdasarkan kelas, terdapat pengendali khas dalam Java - instanceof. Ia mengembalikan nilai truejika ujian itu benar, atau falsejika keputusannya palsu. Mari lihat cara ia berfungsi menggunakan kelas kereta kami sebagai contoh:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Output: true Cek menggunakan operator instanceofreturn true, kerana kita mempunyai objek kelas Truck, dan semua trak adalah kereta. Kelas Truckadalah keturunan kelas Car, oleh itu, semua trak dicipta berdasarkan ibu bapa yang sama - sebuah kereta. Beri perhatian kepada pengendali instanceof: ia ditulis tanpa titik, kerana ia adalah pengendali, bukan kaedah ("objek instanceof Class"). Mari cuba secara berbeza:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Output: false Kelas Cardan, oleh itu, objeknya tidak berasal dari kelas Truck.Semua trak adalah kereta, tetapi tidak semua kereta adalah trak. Objek Cartidak dicipta berdasarkan kelas Truck. Satu lagi contoh:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Output: Benar Logik di sini juga mudah: semua kelas dalam Java, termasuk yang anda buat, datang daripada kelas Object(walaupun anda tidak menulis memanjangkan Objek di dalamnya - mekanisme ini tersirat di dalamnya). Mengapa ini mungkin berguna dan dalam keadaan apa? Penggunaan pengendali yang paling biasa instanceofadalah sebagai penggantian kaedah equals(). Sebagai contoh, berikut ialah cara kaedah dilaksanakan equalsdalam kelas String:
public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
Sebelum membandingkan rentetan dengan objek yang diluluskan, kaedah menyemak: adakah objek yang diluluskan sebenarnya rentetan? Dan barulah dia mula membandingkan sifat dua objek. Tanpa semakan ini, anda boleh menghantar mana-mana objek yang mempunyai medan nilai dan panjang ke dalam kaedah dan membandingkannya dengan rentetan, yang, sudah tentu, adalah salah.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION