CodeGym/Blog Java/rawak/Instanceof dan Inheritance di Jawa
John Squirrels
Tahap
San Francisco

Instanceof dan Inheritance di Jawa

Diterbitkan dalam kumpulan
Hai! Dalam pelajaran sebelum ini, kita telah mengenali secara ringkas konsep pewarisan. Hari ini, kita akan menyentuh topik ini sekali lagi, tetapi sekali lagi tidak terlalu mendalam. Kami masih akan mempunyai pelajaran yang lebih terperinci mengenai perkara ini pada masa hadapan. Hari ini kita hanya akan melihat beberapa contoh praktikal dan berkenalan dengan pengendali yang menarik di Jawa.

Warisan

Jadi, apakah warisan? instanceof dan Warisan 101 - 1 Warisan ialah mekanisme pengaturcaraan (termasuk dalam Java) yang membolehkan anda mengisytiharkan kelas baharu berdasarkan kelas sedia ada. Kelas terbitan kemudiannya mendapat akses kepada medan dan kaedah kelas induk. Mengapa kita memerlukan ini? Nah, bayangkan anda perlu mencipta beberapa kelas kereta dalam program: Lori, RaceCar, Sedan, Pickup, dll. Malah sebelum menulis sebarang kod, anda pasti tahu bahawa semua kelas ini mempunyai banyak persamaan: semua kereta mempunyai model nama, tahun pembuatan, saiz enjin, kelajuan maksimum, dsb. (apatah lagi fakta bahawa mereka semua mempunyai roda dan bahagian lain yang sama). Dalam keadaan ini, anda boleh:
  • Cipta medan ini dalam setiap kelas (tambahkannya pada setiap kelas kereta baharu semasa anda menciptanya)
  • Bawa medan biasa kepada semua kereta ke dalam Carkelas induk, kemudian gunakan kata kunci lanjutan untuk memperoleh semua kelas bagi jenis kereta tertentu daripada Carkelas tersebut.
Sememangnya, pilihan kedua adalah 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 mengelakkan pertindihan kod yang tidak perlu (dan kami harus sentiasa berusaha untuk itu semasa menulis program). Selain itu, kami mempunyai struktur kelas yang ringkas dan mudah difahami, dengan semua medan yang sama untuk semua kereta disatukan menjadi satu kelas. Jika trak mempunyai medan khas yang tidak dimiliki oleh kereta lain, ia boleh diisytiharkan dalam Truckkelas. Begitu juga dengan kaedah. Semua kereta mempunyai tingkah laku biasa tertentu yang boleh diterangkan dengan kaedah, cth menghidupkan kereta, memecut/brek, dsb. Kaedah biasa ini boleh disatukan ke dalam kelas induk Car, dan setiap jenis kereta tertentu boleh menentukan tindakan uniknya dalam kelas terbitannya .
public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Kami menambahkan kaedah biasa kepada semua kereta ke Carkelas. Tetapi, lihat F1Carkelas, yang mewakili kereta lumba "Formula 1". Hentian pit (hentian untuk penyelenggaraan kereta segera) hanya dilakukan dalam perlumbaan, jadi kami menambahkan fungsi khusus ini pada kelas terbitan yang berkaitan. instanceof dan Warisan 101 - 2

instanceof operator

Di Java, terdapat pengendali khas, instanceof , untuk menyemak sama ada objek dicipta berdasarkan kelas tertentu. Ia mengembalikan benar atau salah bergantung pada hasil semakan. Mari lihat cara ia berfungsi menggunakan kelas dalam contoh kereta kami:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Output: true Operator instanceofmengembalikan true , kerana kita mempunyai Truckobjek, dan semua trak adalah kereta. Kelas Truckberasal daripada Carkelas. Semua trak dicipta berdasarkan induk biasa, kelas Car. Lihat dengan teliti bagaimana instanceofoperator digunakan. Anda menulisnya tanpa noktah, kerana ia adalah pengendali, bukan kaedah ("objek instanceof Class”). Mari cuba cara lain:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Output: false Kelas Car(dan objek kereta) tidak terbit daripada Truckkelas. Semua trak adalah kereta, tetapi tidak semua kereta adalah trak. Carobjek tidak berdasarkan Truckkelas. 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: True Di sini logiknya juga mudah: semua kelas dalam Java, termasuk kelas yang anda buat, turun daripada kelas Object(walaupun anda tidak menulis "extends Object"—ia sudah tersirat). Bagaimana dan bila ini berguna? Operator instanceofpaling biasa digunakan apabila mengatasi equals()kaedah. Sebagai contoh, berikut ialah cara equalskaedah dilaksanakan dalam Stringkelas:
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 a Stringdengan objek yang diluluskan, kaedah menguji untuk melihat sama ada objek itu adalah rentetan? Hanya selepas itu ia mula membandingkan sifat dua objek. Jika ujian ini tidak wujud, mana-mana objek dengan medan nilai dan panjang boleh dihantar ke kaedah dan dibandingkan dengan String, yang tentunya salah.
Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi