JavaRush /Java Blog /Random-ID /dasar-dasar instanceof dan pewarisan

dasar-dasar instanceof dan pewarisan

Dipublikasikan di grup Random-ID
Halo! Pada perkuliahan sebelumnya, kita telah beberapa kali menjumpai konsep pewarisan secara singkat. Hari ini kita juga akan membahas topik ini, tetapi tidak terlalu dalam. Nanti akan ada kuliah mendetail tentang hal ini, namun hari ini kita hanya akan melihat contoh praktis dan mengenal salah satu operator menarik di Java.

Warisan Jawa

Lalu, apa sebenarnya warisan itu? dasar-dasar instanceof dan pewarisan - 1Warisan adalah mekanisme dalam pemrograman, termasuk Java, yang memungkinkan Anda mendeskripsikan kelas baru berdasarkan kelas yang sudah ada. Kelas turunan kemudian mendapatkan akses ke bidang dan metode kelas induk. Mengapa hal ini perlu? Misalnya, bayangkan Anda perlu membuat beberapa kelas mobil dalam program: Truk, Balap, Sedan, Pickup, dll. Bahkan tanpa mulai menulis kode, Anda pasti tahu bahwa kelas-kelas ini memiliki banyak kesamaan: semua mobil memiliki nama model, tahun pembuatan, ukuran mesin, kecepatan maksimum, dll. (belum lagi semuanya memiliki roda dan bagian lainnya). Dalam situasi seperti ini, Anda dapat:
  • Buat bidang ini di setiap kelas dan tambahkan ke kelas mobil baru saat bidang tersebut dibuat
  • Pindahkan bidang yang umum untuk semua mesin ke dalam kelas induk Car, dan semua kelas dari jenis mesin tertentu mewarisi Carpenggunaan kata extends .
Opsi kedua, tentu saja, jauh lebih nyaman:
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);
   }
}
Minimal, kami telah menghindari duplikasi kode yang tidak perlu, dan ini adalah sesuatu yang harus selalu kami upayakan saat menulis program. Selain itu, kami memiliki struktur kelas yang sederhana dan mudah dipahami: bidang yang umum untuk semua mesin ditempatkan dalam satu kelas. Jika, misalnya, truk mempunyai bidang tertentu yang tidak dimiliki mobil lain, maka bidang tersebut dapat dinyatakan dalam Truck. Hal yang sama berlaku untuk metode. Semua mobil memiliki beberapa perilaku umum yang dapat dijelaskan: menyalakan mobil, menginjak gas/rem, dll. Metode umum ini dapat ditempatkan di kelas umum Car, dan perilaku spesifik dari setiap tipe tertentu dapat dijelaskan di kelas turunan.
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 metode umum semua mobil ke dalam kelas Car. Namun pada kelas penerusnya F1Car, yang menggambarkan mobil balap Formula 1 - pit stop (berhenti untuk perawatan mendesak mobil), yang hanya dilakukan di balapan dan dibedakan berdasarkan perilaku tertentu.

Operator contoh Java

Untuk memeriksa apakah suatu objek dibuat berdasarkan kelas, ada operator khusus di Java - instanceof. Ia mengembalikan nilai truejika pengujiannya benar, atau falsejika hasilnya salah. Mari kita lihat cara kerjanya menggunakan kelas mobil kita sebagai contoh:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Keluaran: true Pengujian menggunakan operator instanceofdikembalikan true, karena kita memiliki objek kelas Truck, dan semua truk adalah mobil. Kelas Truckadalah turunan dari kelas Car, oleh karena itu, semua truk dibuat berdasarkan induk yang sama - mobil. Perhatikan operator instanceof: ditulis tanpa titik, karena merupakan operator, bukan metode (“object instanceof Class”). Mari kita coba secara berbeda:
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Keluaran: false Kelas Cardan, karenanya, objeknya tidak berasal dari kelas tersebut Truck. Semua truk adalah mobil, tetapi tidak semua mobil adalah truk. Objek Cartidak dibuat berdasarkan kelas Truck. Satu contoh lagi:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Keluaran: Benar Logikanya di sini juga sederhana: semua kelas di Java, termasuk yang Anda buat, berasal dari sebuah kelas Object(walaupun Anda tidak menulis extends Object di dalamnya - mekanisme ini tersirat di dalamnya). Mengapa hal ini mungkin berguna dan dalam kondisi apa? Penggunaan operator yang paling umum instanceofadalah sebagai metode override equals(). Sebagai contoh, berikut adalah bagaimana metode ini diimplementasikan equalsdi 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 string dengan objek yang diteruskan, metode ini memeriksa: apakah objek yang diteruskan sebenarnya adalah string? Dan baru setelah itu dia mulai membandingkan sifat-sifat dua benda. Tanpa pemeriksaan ini, Anda dapat meneruskan objek apa pun yang memiliki bidang nilai dan panjang ke dalam metode dan membandingkannya dengan string, yang tentu saja salah.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION