CodeGym /Blog Java /rawak /Contoh khusus kelas abstrak dalam Java
John Squirrels
Tahap
San Francisco

Contoh khusus kelas abstrak dalam Java

Diterbitkan dalam kumpulan
Hai! Dalam pelajaran lepas, kami bertemu antara muka dan mengetahui kegunaannya. Topik hari ini akan mengulangi topik sebelumnya. Mari kita bercakap tentang kelas abstrak di Jawa. Contoh khusus kelas abstrak dalam Java - 1

Mengapa kelas dipanggil 'abstrak'

Anda mungkin masih ingat apa itu 'abstraksi' — kami telah membincangkannya. :) Jika anda terlupa, jangan takut. Ingat: ini adalah prinsip OOP yang mengatakan apabila mereka bentuk kelas dan mencipta objek, kita harus mengenal pasti hanya sifat utama entiti dan membuang minor. Sebagai contoh, jika kita mereka bentuk SchoolTeacherkelas, kita tidak memerlukan sifat ' ketinggian '. Sesungguhnya harta ini tidak relevan bagi seorang guru. Tetapi jika kita mencipta BasketballPlayerkelas, maka pertumbuhan akan menjadi ciri penting. Jadi dengar. Kelas abstrakadalah abstrak kerana ia datang — 'kosong' yang belum selesai untuk sekumpulan kelas masa hadapan. Kosong tidak boleh digunakan seperti sedia ada. Ia terlalu 'mentah'. Tetapi ia menerangkan keadaan tertentu dan tingkah laku umum yang akan dimiliki oleh kelas masa depan yang mewarisi kelas abstrak.

Contoh kelas Java abstrak

Pertimbangkan contoh mudah dengan kereta:

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;
   }
}
Inilah rupa kelas abstrak yang paling mudah. Seperti yang anda lihat, ia bukan sesuatu yang istimewa :) Mengapa kita memerlukannya? Pertama sekali, ia menerangkan entiti yang diperlukan kami, sebuah kereta, dengan cara yang paling abstrak yang mungkin. Terdapat sebab mengapa kami menggunakan perkataan abstrak . Di dunia nyata, tiada 'kereta abstrak'. Terdapat trak, kereta lumba, sedan, coupe dan SUV. Kelas abstrak kami hanyalah 'cetak biru' yang akan kami gunakan kemudian untuk membuat kelas kereta.

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 hampir sama dengan apa yang kita bincangkan dalam pelajaran tentang pewarisan. Tetapi dalam pelajaran itu, kami mempunyai kelas Kereta dan kaedahnya tidak abstrak. Tetapi penyelesaian itu mempunyai beberapa kelemahan yang ditetapkan dalam kelas abstrak. Pertama sekali, anda tidak boleh membuat contoh 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 mereka bentuk 'ciri' ini. Sekali lagi, sebagai peringatan: kelas abstrak hanyalah rangka tindakan untuk kelas 'biasa' akan datang . Anda tidak memerlukan salinan pelan tindakan, bukan? Dan anda tidak mencipta contoh kelas abstrak :) Tetapi jika Carkelas itu bukan abstrak, kami boleh mencipta contoh kelas itu dengan mudah:

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 mempunyai beberapa jenis kereta yang tidak dapat difahami — ia bukan trak, bukan kereta lumba, bukan sedan, dan ia sama sekali tidak jelas apa itu. Ini adalah 'kereta abstrak' yang tidak wujud dalam alam semula jadi. Kita boleh memberikan contoh yang sama menggunakan haiwan. Bayangkan jika Animalkelas ( haiwan abstrak ). Tidak jelas jenis haiwan itu, kepunyaan keluarga apa dan ciri-ciri yang dimilikinya. Ia akan menjadi pelik untuk melihatnya dalam program anda. Tiada 'haiwan abstrak' dalam alam semula jadi. Hanya anjing, kucing, musang, tahi lalat, dsb. Kelas abstrak memberikan kita daripada objek abstrak. Mereka memberi kita keadaan dan tingkah laku asas. Sebagai contoh, semua kereta harus mempunyai model , warna dan kelajuan maksimum , dan anda seharusnya boleh menggunakangas dan brek . Itu sahaja. Ini adalah rancangan abstrak umum. Seterusnya anda mereka bentuk kelas yang anda perlukan. Nota: dua kaedah dalam kelas abstrak juga ditetapkan sebagai abstract , dan mereka tidak mempunyai sebarang pelaksanaan. Sebabnya adalah sama: kelas abstrak tidak mencipta tingkah laku lalai untuk kereta abstrak. Mereka hanya menunjukkan apa yang setiap kereta sepatutnya boleh lakukan. Walau bagaimanapun, jika anda memerlukan tingkah laku lalai, anda boleh melaksanakan kaedah dalam 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();
   }
}
Output konsol: "Gas!" Seperti yang anda lihat, kami telah melaksanakan kaedah pertama dalam kelas abstrak dan bukan yang kedua. Akibatnya, Sedantingkah laku kelas kami dibahagikan kepada dua bahagian: jika anda memanggil kaedah gas(), panggilan 'meningkat' sehingga Carkelas induk abstrak, tetapi kami mengatasi brake()kaedah dalam Sedankelas. Ini ternyata sangat mudah dan fleksibel. Tetapi sekarang kelas kami tidak begitu abstrak ? Lagipun, separuh daripada kaedahnya dilaksanakan. Ini sebenarnya adalah ciri yang sangat penting - kelas adalah abstrak jika sekurang-kurangnya satu daripada kaedahnya adalah abstrak. Satu daripada dua kaedah, atau sekurang-kurangnya satu daripada seribu kaedah — tidak ada bezanya. Kita juga boleh melaksanakan semua kaedah dan tidak meninggalkan satu pun daripada mereka abstrak. Kemudian ia akan menjadi kelas abstrak tanpa kaedah abstrak. Pada dasarnya, ini mungkin, dan pengkompil tidak akan menghasilkan ralat, tetapi lebih baik untuk mengelakkannya: Perkataan abstrak kehilangan maknanya, dan rakan pengaturcara anda akan sangat terkejut :/ Pada masa yang sama, jika kaedah ditandakan dengan perkataan abstrak, setiap kelas kanak-kanak mesti melaksanakannya atau mengisytiharkannya sebagai abstrak. Jika tidak, pengkompil akan menghasilkan ralat. Sudah tentu, setiap kelas boleh mewarisi hanya satu kelas abstrak, jadi dari segi pewarisan tidak ada perbezaan antara kelas abstrak dan biasa. Tidak kira sama ada kita mewarisi kelas abstrak atau kelas biasa, hanya ada satu kelas induk.

Mengapa Java tidak mempunyai pelbagai warisan kelas

Kami telah mengatakan bahawa Java tidak mempunyai berbilang warisan, tetapi kami belum benar-benar meneroka sebabnya. Mari cuba lakukannya sekarang. Hakikatnya ialah jika Java mempunyai berbilang warisan, kelas kanak-kanak tidak akan dapat menentukan tingkah laku tertentu yang harus mereka pilih. Katakan kita mempunyai 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, kedua-duanya mempunyai on()kaedah. Untuk pembakar roti, ia mula dibakar. Untuk bom nuklear, ia mencetuskan letupan. Oops: / Sekarang bayangkan anda memutuskan (jangan tanya saya mengapa!) untuk mencipta sesuatu di antaranya. Dan dengan itu anda mempunyai MysteriousDevicekelas! Kod ini, sudah tentu, tidak berfungsi dan kami hanya menyediakannya sebagai contoh 'tetapi boleh jadi':

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 ada. Peranti misteri itu secara serentak mewarisi Pembakar Roti dan Bom Nuklear. Kedua-duanya mempunyai on()kaedah. Akibatnya, jika kita memanggil on()kaedah, tidak jelas yang mana satu harus digunakan pada MysteriousDeviceobjek. Tidak mungkin objek itu boleh tahu. Dan untuk mengatasi semuanya: Bom Nuklear tidak mempunyai off()kaedah, jadi jika kami tidak meneka dengan betul, adalah mustahil untuk melumpuhkan peranti itu. Contoh khusus kelas abstrak dalam Java - 2Ia adalah tepat kerana 'kekeliruan' ini, di mana objek tidak tahu tingkah laku yang perlu dipamerkan, pencipta Java meninggalkan pelbagai warisan. Walau bagaimanapun, anda akan ingat bahawa kelas Java boleh melaksanakan berbilang antara muka. Ngomong-ngomong, dalam pengajian anda, anda telah menemui sekurang-kurangnya satu kelas abstrak!

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Ia adalah kawan lama anda, kelas Calendar. Ia abstrak dan mempunyai beberapa anak. Salah satunya ialah GregorianCalendar. Anda sudah menggunakannya dalam pelajaran tentang tarikh. :) Semuanya nampak cukup jelas. Hanya ada satu soalan: apakah perbezaan asas antara kelas abstrak dan antara muka? Mengapa mereka menambah kedua-duanya ke Java dan bukannya hanya mengehadkan bahasa kepada satu? Lagipun, itu sudah memadai sepenuhnya. Kita akan membincangkan perkara ini dalam pelajaran seterusnya ! Sehingga nanti :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION