JavaRush /Java Blog /Random-ID /Kelas abstrak di Java dengan contoh spesifik

Kelas abstrak di Java dengan contoh spesifik

Dipublikasikan di grup Random-ID
Halo! Dalam kuliah sebelumnya, kita mengenal antarmuka dan mencari tahu kegunaannya. Topik hari ini akan memiliki kesamaan dengan topik sebelumnya. Mari kita bicara tentang kelas abstrak di Java. Kelas abstrak di Java dengan contoh konkrit - 1

Mengapa kelas disebut "abstrak"

Anda mungkin ingat apa itu "abstraksi" - kami sudah membahasnya :) Jika Anda tiba-tiba lupa, tidak apa-apa, ingat: ini adalah prinsip OOP , yang menurutnya ketika mendesain kelas dan membuat objek, perlu untuk menyorot hanya properti utama suatu entitas dan membuang properti sekunder. Misalnya, jika kita merancang sebuah kelas SchoolTeacher- seorang guru sekolah - kemungkinan besar kita tidak memerlukan karakteristik “ tinggi badan ”. Memang bagi seorang guru sifat ini tidak penting. Namun jika kita membuat kelas dalam program BasketballPlayer- pemain bola basket - tinggi badan akan menjadi salah satu ciri utamanya. Jadi, kelas abstrak adalah kelas “kosong” yang paling abstrak dan sangat mendekati untuk sekelompok kelas yang akan datang. Persiapan ini tidak dapat digunakan dalam bentuk jadi - terlalu “mentah”. Tapi ini menggambarkan keadaan umum dan perilaku tertentu yang akan dimiliki oleh kelas masa depan - pewaris kelas abstrak.

Contoh Kelas Abstrak Java

Mari kita lihat contoh sederhana pada mobil:

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;
  
   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
Seperti inilah tampilan kelas abstrak yang paling sederhana. Seperti yang Anda lihat, tidak ada yang istimewa :) Untuk apa kita membutuhkannya? Pertama-tama, dia mendeskripsikan entitas yang kita butuhkan dengan cara yang paling abstrak - sebuah mobil. Kata abstrak ada di sini karena suatu alasan. Tidak ada “mesin yang adil” di dunia. Ada truk, mobil balap, sedan, coupe, SUV. Kelas abstrak kita hanyalah sebuah “cetak biru” yang nantinya akan kita buat kelas mobil.

public class Sedan extends Car {
  
   @Override
   public void gas() {
       System.out.println("The sedan accelerates!");
   }

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }
  
}
Hal ini mirip dengan apa yang kita bicarakan dalam kuliah tentang warisan. Hanya di sana kami memiliki kelas Cardan metodenya yang tidak abstrak. Namun solusi ini memiliki sejumlah kelemahan, yang diperbaiki di kelas abstrak. Pertama dan terpenting, sebuah instance dari kelas abstrak tidak dapat dibuat:

public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
“Trik” ini diterapkan secara khusus oleh pembuat Java. Sekali lagi, perlu diingat: kelas abstrak hanyalah cetak biru untuk kelas "normal" di masa depan . Anda tidak memerlukan salinan gambarnya, bukan? Jadi tidak perlu membuat instance kelas abstrak :) Dan jika kelas tersebut Carbukan abstrak, kita dapat dengan mudah membuat objeknya:

public class Car {

   private String model;
   private String color;
   private int maxSpeed;
  
   public void gas() {
       // some logic
   }

   public  void brake() {
       // some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Everything is OK, the machine has been created
   }
}
Sekarang kami memiliki semacam mobil aneh dalam program kami - bukan truk, bukan mobil balap, bukan sedan, tetapi sesuatu secara umum. Itu sama “hanya sebuah mesin” yang tidak ada di alam. Contoh yang sama dapat diberikan pada hewan. Bayangkan jika objek muncul di program Anda Animal- “ hanya seekor binatang ”. Apa jenisnya, milik keluarga apa, ciri-ciri apa yang dimilikinya - tidak jelas. Akan aneh melihatnya di program itu. Tidak ada yang “hanya binatang” di alam. Hanya anjing, kucing, rubah, tikus tanah dan lain-lain. Kelas abstrak membebaskan kita dari “ hanya benda ”. Mereka memberi kita keadaan dan perilaku dasar. Misalnya semua mobil harus mempunyai model , warna dan kecepatan maksimal , serta harus mampu gas dan rem . Itu saja. Ini adalah skema abstrak umum, kemudian Anda sendiri yang merancang kelas yang Anda butuhkan. Harap diperhatikan: dua metode dalam kelas abstract juga ditetapkan sebagai abstract , dan keduanya tidak diimplementasikan sama sekali. Alasannya sama: kelas abstrak tidak membuat "perilaku default" untuk "mesin belaka". Mereka hanya bilang mereka harus bisa membuat semua mobil. Namun, jika Anda masih memerlukan perilaku default, Anda bisa mengimplementasikan metode di kelas abstrak. Java tidak melarang ini:

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Let's go!");
   }

   public abstract void brake();
  
   //getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
Keluaran konsol: “Dapatkan akselerasi!” Seperti yang Anda lihat, kami menerapkan satu metode di kelas abstrak, tetapi tidak mengimplementasikan metode kedua. Akibatnya, perilaku kelas kami Sedandibagi menjadi dua bagian: jika Anda memanggil metode di dalamnya gas(), itu akan "ditarik" dari kelas abstrak induk Car, dan brake()kami mendefinisikan ulang metode di kelas tersebut Sedan. Ternyata sangat nyaman dan fleksibel. Tapi sekarang kelas kita tidak begitu abstrak ? Faktanya, setengah dari metodenya telah diterapkan. Faktanya - dan ini adalah fitur yang sangat penting - suatu kelas bersifat abstract jika setidaknya salah satu metodenya adalah abstract . Setidaknya satu dari dua, setidaknya satu dari seribu metode - tidak masalah. Kami bahkan dapat menerapkan semua metode dan tidak meninggalkan satu pun metode abstrak. Akan ada kelas abstrak tanpa metode abstrak. Pada prinsipnya, hal ini mungkin terjadi, dan kompiler tidak akan menghasilkan kesalahan, tetapi lebih baik tidak melakukan ini: kata abstrak akan kehilangan maknanya, dan rekan pemrogram Anda akan sangat terkejut melihat ini :/ Terlebih lagi, jika suatu metode ditandai dengan kata abstrak, maka setiap kelas turunannya harus mengimplementasikan atau dinyatakan abstrak. Kalau tidak, kompiler akan membuat kesalahan . Tentunya setiap kelas hanya dapat mewarisi dari satu kelas abstrak saja, sehingga dari segi pewarisan tidak ada perbedaan antara kelas abstrak dan kelas reguler. Tidak masalah apakah kita mewarisi dari kelas abstrak atau dari kelas biasa, hanya ada satu kelas induk.

Mengapa tidak ada pewarisan banyak kelas di Jawa?

Kami telah mengatakan bahwa tidak ada pewarisan berganda di Java, tetapi kami belum mengetahui alasannya. Mari kita coba ini sekarang. Intinya adalah jika Java memiliki banyak warisan, kelas anak tidak akan dapat memutuskan perilaku mana yang akan dipilih. Katakanlah kita memiliki dua kelas - Tosterdan NuclearBomb:

public class Toster {
  
  
 public void on() {

       System.out.println("The toaster is on, the toast is getting ready!");
   }
  
   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Взрыв!");
   }
}
Seperti yang Anda lihat, keduanya memiliki metode on(). Dalam kasus pemanggang roti, ia mulai memasak roti panggang, dan dalam kasus bom nuklir, hal itu menyebabkan ledakan. Oh :/ Sekarang bayangkan Anda memutuskan (tiba-tiba saya tidak tahu kenapa!) untuk menciptakan sesuatu di antaranya. Dan ini kelasmu - MysteriousDevice! Kode ini, tentu saja, tidak berfungsi, dan kami menyajikannya hanya sebagai contoh “bagaimana hal itu bisa terjadi”:

public class MysteriousDevice extends Toster, NuclearBomb {

   public static void main(String[] args) {
      
       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // And what should happen here? Will we get a toast, or a nuclear apocalypse?
   }
}
Mari kita lihat apa yang kita punya. Perangkat misterius itu berasal dari Pemanggang Roti dan Bom Nuklir. Keduanya mempunyai metode on(), dan akibatnya, tidak jelas metode mana on()yang harus diaktifkan pada objek MysteriousDevicejika kita memanggilnya. Objek tidak akan dapat memahami hal ini. Nah, sebagai pelengkap: Bom Nuklir tidak memiliki metode off(), jadi jika tebakan kita salah, tidak akan ada cara untuk mematikan perangkat. Kelas abstrak di Java dengan contoh konkrit - 2 Justru karena kebingungan ini, ketika suatu objek tidak jelas perilaku mana yang harus dipilih, pencipta Java meninggalkan pewarisan berganda. Namun, Anda ingat bahwa kelas Java mengimplementasikan banyak antarmuka. Omong-omong, Anda telah menjumpai setidaknya satu kelas abstrak dalam studi Anda! Meskipun, mungkin saya tidak menyadarinya :)

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Ini teman sekelasmu yang lama Calendar. Itu abstrak dan memiliki beberapa ahli waris. Salah satunya adalah GregorianCalendar. Anda sudah menggunakannya dalam pelajaran tentang tanggal :) Semuanya tampak jelas, hanya ada satu hal yang tersisa: apa perbedaan mendasar antara kelas abstrak dan antarmuka ? Mengapa mereka menambahkan keduanya ke Java, dan tidak membatasi diri hanya pada satu saja? Ini mungkin sudah cukup. Kita akan membicarakan hal ini pada kuliah berikutnya! Sampai jumpa:)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION