CodeGym /Java Blog /Acak /Contoh spesifik kelas abstrak di Jawa
John Squirrels
Level 41
San Francisco

Contoh spesifik kelas abstrak di Jawa

Dipublikasikan di grup Acak
Hai! Dalam pelajaran sebelumnya, kami bertemu antarmuka dan menemukan untuk apa mereka. Topik hari ini akan menggemakan topik sebelumnya. Mari kita bicara tentang kelas abstrak di Jawa. Contoh spesifik kelas abstrak di Java - 1

Mengapa kelas disebut 'abstrak'

Anda mungkin ingat apa itu 'abstraksi' — kita sudah membahasnya. :) Jika Anda lupa, jangan takut. Ingat: itu adalah prinsip OOP yang mengatakan saat mendesain kelas dan membuat objek, kita harus mengidentifikasi hanya properti utama entitas dan membuang yang minor. Misalnya, jika kita sedang mendesain SchoolTeacherkelas, kita hampir tidak membutuhkan properti ' height '. Memang, properti ini tidak relevan bagi seorang guru. Namun jika kita membuat sebuah BasketballPlayerkelas, maka pertumbuhan akan menjadi karakteristik yang penting. Jadi dengarkan. Kelas abstrakadalah abstrak saat mereka datang - 'kosong' yang belum selesai untuk sekelompok kelas masa depan. Kosong tidak dapat digunakan apa adanya. Itu terlalu 'mentah'. Tapi itu menggambarkan keadaan tertentu dan perilaku umum yang akan dimiliki oleh kelas masa depan yang mewarisi kelas abstrak.

Contoh kelas Java abstrak

Pertimbangkan contoh sederhana dengan 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 :) Mengapa kita membutuhkannya? Pertama-tama, ini menggambarkan entitas yang kita butuhkan, sebuah mobil, dengan cara yang paling abstrak. Ada alasan mengapa kami menggunakan kata abstract . Di dunia nyata, tidak ada 'mobil abstrak'. Ada truk, mobil balap, sedan, coupe, dan SUV. Kelas abstrak kita hanyalah 'cetak biru' yang akan kita gunakan nanti untuk membuat kelas mobil.

public class Sedan extends Car {

   @Override
   public void gas() {
       System.out.println("The sedan is accelerating!");
   }

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

}
Ini sangat mirip dengan apa yang kita bicarakan dalam pelajaran tentang warisan. Namun dalam pelajaran tersebut, kami memiliki kelas Mobil dan metodenya tidak abstrak. Tapi solusi itu memiliki sejumlah kekurangan yang diperbaiki di kelas abstrak. Pertama dan terpenting, Anda tidak dapat membuat turunan dari kelas abstrak :

public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Pencipta Java secara khusus merancang 'fitur' ini. Sekali lagi, sebagai pengingat: kelas abstrak hanyalah cetak biru untuk kelas 'normal' di masa mendatang . Anda tidak memerlukan salinan cetak birunya, bukan? Dan Anda tidak membuat turunan dari kelas abstrak :) Tetapi jika Carkelas tersebut tidak abstrak, kita dapat dengan mudah membuat turunannya:

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 fine. A car is created.
   }
}
Sekarang program kami memiliki semacam mobil yang tidak dapat dipahami - ini bukan truk, bukan mobil balap, bukan sedan, dan sama sekali tidak jelas apa itu. Ini adalah 'mobil abstrak' yang tidak ada di alam. Kami dapat memberikan contoh yang sama menggunakan hewan. Bayangkan jika Animalkelas ( hewan abstrak ). Tidak jelas hewan apa itu, dari keluarga apa, dan karakteristik apa yang dimilikinya. Akan aneh melihat itu di program Anda. Tidak ada 'hewan abstrak' di alam. Hanya anjing, kucing, rubah, tahi lalat, dll. Kelas abstrak membebaskan kita dari objek abstrak. Mereka memberi kita keadaan dan perilaku dasar. Misalnya, semua mobil harus memiliki model , warna , dan kecepatan maksimal , dan Anda harus bisa menerapkannyagas dan rem . Itu dia. Ini adalah rencana abstrak umum. Selanjutnya Anda merancang kelas yang Anda butuhkan. Catatan: dua metode di kelas abstrak juga ditetapkan sebagai abstract , dan tidak memiliki implementasi apa pun. Alasannya sama: kelas abstrak tidak membuat perilaku default untuk mobil abstrak. Mereka hanya menunjukkan apa yang harus dapat dilakukan oleh setiap mobil. Namun, jika Anda memerlukan perilaku default, Anda dapat 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("Gas!");
   }

   public abstract void brake();

   // Getters and setters
}


public class Sedan extends Car {

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

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
Keluaran konsol: "Gas!" Seperti yang Anda lihat, kami menerapkan metode pertama di kelas abstrak, dan bukan yang kedua. Akibatnya, Sedanperilaku kelas kami dibagi menjadi dua bagian: jika Anda memanggil metode gas(), panggilan 'naik' ke Carkelas induk abstrak, tetapi kami mengesampingkan brake()metode di Sedankelas. Ini ternyata sangat nyaman dan fleksibel. Tapi sekarang kelas kami tidak begitu abstrak ? Lagi pula, setengah dari metodenya diimplementasikan. Ini sebenarnya adalah fitur yang sangat penting - sebuah kelas bersifat abstrak jika setidaknya salah satu metodenya abstrak. Satu dari dua metode, atau setidaknya satu dari seribu metode — tidak ada bedanya. Kami bahkan dapat mengimplementasikan semua metode dan tidak meninggalkan satupun yang abstrak. Maka itu akan menjadi kelas abstrak tanpa metode abstrak. Pada prinsipnya, ini mungkin, dan kompiler tidak akan menghasilkan kesalahan, tetapi lebih baik menghindarinya: Kata abstrak kehilangan artinya, dan sesama pemrogram Anda akan sangat terkejut :/ Pada saat yang sama, jika suatu metode ditandai dengan kata abstrak, setiap kelas anak harus mengimplementasikannya atau mendeklarasikannya sebagai abstrak. Jika tidak, kompiler akan menghasilkan kesalahan. Tentu saja, setiap class hanya dapat mewarisi satu class abstrak, jadi dalam hal pewarisan tidak ada perbedaan antara class abstrak dan class biasa. Tidak masalah jika kita mewarisi kelas abstrak atau kelas biasa, hanya ada satu kelas induk.

Mengapa Java tidak memiliki banyak pewarisan kelas

Kami telah mengatakan bahwa Java tidak memiliki banyak pewarisan, tetapi kami belum benar-benar menyelidiki alasannya. Mari kita coba melakukannya sekarang. Faktanya adalah bahwa jika Java memiliki banyak pewarisan, kelas anak tidak akan dapat memutuskan perilaku spesifik mana yang harus mereka pilih. Misalkan kita memiliki dua kelas — Toasterdan NuclearBomb:

public class Toaster {


 public void on() {

       System.out.println("The toaster is on. Toast is being prepared!");
   }

   public void off() {

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


public class NuclearBomb {

   public void on() {

       System.out.println("Boom!");
   }
}
Seperti yang Anda lihat, keduanya memiliki on()metode. Untuk pemanggang roti, ia mulai memanggang. Untuk bom nuklir, itu memicu ledakan. Ups: / Sekarang bayangkan Anda memutuskan (jangan tanya kenapa!) untuk membuat sesuatu di antaranya. Dan dengan demikian Anda memiliki MysteriousDevicekelas! Kode ini, tentu saja, tidak berfungsi, dan kami hanya memberikannya sebagai contoh 'tetapi bisa saja':

public class MysteriousDevice extends Toaster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // So what should happen here? Do we get toast or a nuclear apocalypse?
   }
}
Mari kita lihat apa yang kita miliki. Perangkat misterius itu secara bersamaan mewarisi Pemanggang Roti dan Bom Nuklir. Keduanya memiliki on()metode. Akibatnya, jika kita memanggil on()metode, tidak jelas metode mana yang harus dipanggil pada MysteriousDeviceobjek. Tidak mungkin objek itu bisa tahu. Dan yang terpenting: NuclearBomb tidak memiliki off()metode, jadi jika kami tidak menebak dengan benar, tidak mungkin untuk menonaktifkan perangkat. Contoh spesifik kelas abstrak di Java - 2Justru karena 'kebingungan' ini, di mana objek tidak tahu perilaku apa yang harus ditampilkan, pencipta Java meninggalkan banyak pewarisan. Namun, Anda akan ingat bahwa kelas Java dapat mengimplementasikan banyak antarmuka. Omong-omong, dalam studi Anda, Anda telah menemukan setidaknya satu kelas abstrak!

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Itu teman lamamu, kelas Calendar. Itu abstrak dan memiliki beberapa anak. Salah satunya adalah GregorianCalendar. Anda sudah menggunakannya dalam pelajaran tentang tanggal. :) Semuanya tampak cukup jelas. Hanya ada satu pertanyaan: apa perbedaan mendasar antara kelas abstrak dan antarmuka? Mengapa mereka menambahkan keduanya ke Java daripada hanya membatasi satu bahasa? Lagi pula, itu sudah cukup memadai. Kita akan membicarakan ini di pelajaran selanjutnya ! Sampai saat itu :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION