CodeGym /Java Blog /Acak /Instanceof dan Warisan di Jawa
John Squirrels
Level 41
San Francisco

Instanceof dan Warisan di Jawa

Dipublikasikan di grup Acak
Hai! Dalam pelajaran sebelumnya, kita telah secara singkat mengenal konsep pewarisan. Hari ini, kita akan membahas topik ini lagi, tetapi sekali lagi tidak terlalu dalam. Kami masih akan memiliki pelajaran yang lebih rinci tentang ini di masa depan. Hari ini kita hanya akan melihat sekilas beberapa contoh praktis dan berkenalan dengan operator yang menarik di Jawa.

Warisan

Jadi, apa itu warisan? instanceof dan Warisan 101 - 1 Inheritance adalah mekanisme pemrograman (termasuk di Java) yang memungkinkan Anda mendeklarasikan kelas baru berdasarkan kelas yang sudah ada. Kelas turunan kemudian mendapatkan akses ke bidang dan metode kelas induk. Mengapa kita membutuhkan ini? Nah, bayangkan Anda perlu membuat beberapa kelas mobil dalam suatu program: Truk, Mobil Balap, Sedan, Pickup, dll. Bahkan sebelum menulis kode apa pun, Anda tahu pasti bahwa semua kelas ini memiliki banyak kesamaan: semua mobil memiliki modelnya nama, tahun pembuatan, ukuran mesin, kecepatan maksimum, dll. (belum lagi fakta bahwa semuanya memiliki kesamaan roda dan bagian lain). Dalam situasi ini, Anda dapat:
  • Buat bidang ini di setiap kelas (menambahkannya ke setiap kelas mobil baru saat Anda membuatnya)
  • Bawa bidang yang umum untuk semua mobil ke dalam Carkelas induk, lalu gunakan kata kunci meluas untuk mendapatkan semua kelas untuk jenis mobil tertentu dari Carkelas tersebut.
Secara alami, opsi kedua 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 menghindari duplikasi kode yang tidak perlu (dan kami harus selalu mengusahakannya saat menulis program). Selain itu, kami memiliki struktur kelas yang sederhana dan mudah dipahami, dengan semua bidang umum untuk semua mobil dikonsolidasikan ke dalam satu kelas. Jika truk memiliki bidang khusus yang tidak dimiliki mobil lain, mereka dapat dideklarasikan di kelas Truck. Hal yang sama berlaku untuk metode. Semua mobil memiliki perilaku umum tertentu yang dapat dijelaskan dengan metode, misalnya menyalakan mobil, mempercepat/mengerem, dll. Metode umum ini dapat dikonsolidasikan ke dalam kelas induk Car, dan setiap jenis mobil tertentu dapat menentukan tindakan uniknya di kelas turunannya .

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 metode umum untuk semua mobil ke kelas Car. Tapi, lihat kelasnya F1Car, yang merepresentasikan mobil balap "Formula 1". Pit stop (berhenti untuk perawatan mobil yang mendesak) hanya dilakukan dalam balapan, jadi kami menambahkan fungsionalitas khusus ini ke kelas turunan yang relevan. instanceof dan Warisan 101 - 2

operator instanceof

Di Jawa, ada operator khusus, instanceof , untuk memeriksa apakah suatu objek dibuat berdasarkan kelas tertentu. Itu mengembalikan benar atau salah tergantung pada hasil cek. Mari kita lihat cara kerjanya menggunakan kelas dalam contoh mobil kita:

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 , karena kita memiliki Truckobjek, dan semua truk adalah mobil. Kelas Truckberasal dari Carkelas. Semua truk dibuat berdasarkan kesamaan induk, kelas Car. Perhatikan baik-baik bagaimana instanceofoperator digunakan. Anda menulisnya tanpa tanda titik, karena ini adalah operator, bukan metode ("object instanceof Class"). Mari kita coba cara lain:

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Output: false Kelas Car(dan objek mobil) tidak berasal dari Truckkelas. Semua truk adalah mobil, tetapi tidak semua mobil adalah truk. Carobjek tidak didasarkan pada Truckkelas. 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 Di sini logikanya juga sederhana: semua kelas di Java, termasuk kelas yang Anda buat, diturunkan dari Objectkelas tersebut (walaupun Anda tidak menulis "extends Object"—itu sudah tersirat). Bagaimana dan kapan ini akan berguna? Operator instanceofpaling sering digunakan saat mengganti equals()metode. Misalnya, inilah cara equalspenerapan metode di 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 diteruskan, metode menguji untuk melihat apakah objek tersebut bahkan berupa string? Baru setelah itu mulai membandingkan properti kedua objek. Jika pengujian ini tidak ada, objek apa pun dengan bidang nilai dan panjang dapat diteruskan ke metode dan dibandingkan dengan String, yang tentu saja salah.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION