JavaRush /Blog Java /Random-MS /Kelas abstrak di Jawa dengan contoh khusus

Kelas abstrak di Jawa dengan contoh khusus

Diterbitkan dalam kumpulan
hello! Dalam kuliah sebelum ini, kami berkenalan dengan antara muka dan mengetahui apa yang mereka perlukan. Topik hari ini akan mempunyai persamaan dengan topik sebelumnya. Mari kita bercakap tentang kelas abstrak di Jawa. Kelas abstrak di Jawa dengan contoh konkrit - 1

Mengapa kelas dipanggil "abstrak"

Anda mungkin masih ingat apa itu "abstraksi" - kami telah membincangkannya :) Jika anda tiba-tiba terlupa, tidak mengapa, mari ingat: ini adalah prinsip OOP , mengikut mana apabila mereka bentuk kelas dan mencipta objek, anda perlu menyerlahkan hanya sifat utama entiti dan buang yang kedua. Sebagai contoh, jika kita mereka bentuk kelas SchoolTeacher- seorang guru sekolah - kita tidak mungkin memerlukan ciri " ketinggian ". Sesungguhnya: bagi seorang guru ciri ini tidak penting. Tetapi jika kita membuat kelas dalam program BasketballPlayer- pemain bola keranjang - ketinggian akan menjadi salah satu ciri utama. Jadi, kelas abstrak ialah "kosong" yang paling abstrak, oh-so-anggaran untuk sekumpulan kelas masa hadapan. Penyediaan ini tidak boleh digunakan dalam bentuk siap - ia terlalu "mentah". Tetapi ia menerangkan keadaan umum dan tingkah laku tertentu yang akan dimiliki oleh kelas masa depan - pewaris kelas abstrak.

Contoh Kelas Abstrak Java

Mari lihat 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, tiada yang istimewa :) Untuk apa kita memerlukannya? Pertama sekali, dia menerangkan entiti yang kita perlukan dengan cara yang paling abstrak yang mungkin - sebuah kereta. Perkataan abstrak ada di sini atas sebab tertentu. Tidak ada "mesin sahaja" di dunia. Terdapat trak, kereta lumba, sedan, coupe, SUV. Kelas abstrak kami hanyalah "cetak biru" yang daripadanya kami akan membuat kelas kereta kemudian.
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!");
   }

}
Ini sama seperti apa yang kita bincangkan dalam kuliah tentang pewarisan. Hanya di sana kami mempunyai kelas Cardan kaedahnya yang tidak abstrak. Tetapi penyelesaian ini mempunyai beberapa kelemahan, yang diperbetulkan dalam kelas abstrak. Pertama sekali, contoh kelas abstrak tidak boleh dibuat:
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
"Helah" ini dilaksanakan secara khusus oleh pencipta Java. Sekali lagi, hanya untuk diingati: kelas abstrak hanyalah rangka tindakan untuk kelas "biasa" masa hadapan . Anda tidak memerlukan salinan lukisan itu, bukan? Jadi tidak perlu mencipta contoh kelas abstrak :) Dan jika kelas itu Carbukan abstrak, kita boleh mencipta objeknya 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 OK, the machine has been created
   }
}
Sekarang kami mempunyai beberapa jenis kereta pelik dalam program kami - bukan trak, bukan kereta lumba, bukan sedan, tetapi sesuatu secara umum. Itu "hanya mesin" yang sama yang tidak wujud dalam alam semula jadi. Contoh yang sama boleh diberikan dengan haiwan. Bayangkan jika objek muncul dalam program anda Animal- " hanya haiwan ". Jenis apa itu, keluarga apa yang dimiliki, ciri-ciri apa yang ada - tidak jelas. Pelik melihatnya dalam program itu. Tidak ada "hanya haiwan" dalam alam semula jadi. Hanya anjing, kucing, musang, tahi lalat dan lain-lain. Kelas abstrak membebaskan kita daripada " objek sahaja ". Mereka memberi kita keadaan dan tingkah laku asas. Sebagai contoh, semua kereta mesti mempunyai model , warna dan kelajuan maksimum , dan ia juga mesti boleh gas dan brek . Itu sahaja. Ini adalah skema abstrak umum, maka anda sendiri mereka bentuk kelas yang anda perlukan. Sila ambil perhatian: dua kaedah dalam kelas abstrak juga ditetapkan sebagai abstract , dan ia tidak dilaksanakan sama sekali. Sebabnya adalah sama: kelas abstrak tidak mencipta "tingkah laku lalai" untuk "mesin semata-mata". Mereka hanya mengatakan bahawa mereka sepatutnya boleh membuat semua kereta. Walau bagaimanapun, jika anda masih 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("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();
   }
}
Output konsol: "Percepatkan!" Seperti yang anda lihat, kami melaksanakan satu kaedah dalam kelas abstrak, tetapi tidak melaksanakan yang kedua. Akibatnya, gelagat kelas kami Sedandibahagikan kepada dua bahagian: jika anda memanggil kaedah padanya gas(), ia akan "menarik" daripada kelas abstrak induk Cardan brake()kami mentakrifkan semula kaedah dalam kelas Sedan. Ia ternyata sangat mudah dan fleksibel. Tetapi sekarang kelas kita tidak begitu abstrak ? Lagipun, sebenarnya, separuh daripada kaedahnya dilaksanakan. Sebenarnya - dan ini adalah ciri yang sangat penting - kelas adalah abstrak jika sekurang-kurangnya satu daripada kaedahnya adalah abstrak . Sekurang-kurangnya satu daripada dua, sekurang-kurangnya satu daripada seribu kaedah - tidak mengapa. Kita juga boleh melaksanakan semua kaedah dan tidak meninggalkan apa-apa yang abstrak. Akan ada kelas abstrak tanpa kaedah abstrak. Pada dasarnya, ini mungkin, dan pengkompil tidak akan menghasilkan ralat, tetapi lebih baik tidak melakukan ini: perkataan abstrak akan kehilangan maknanya, dan rakan pengaturcara anda akan sangat terkejut melihat ini :/ Selain itu, jika kaedah ditandakan dengan perkataan abstrak, setiap kelas keturunan mesti melaksanakan atau diisytiharkan abstrak. Jika tidak pengkompil akan membuang ralat . Sudah tentu, setiap kelas boleh mewarisi hanya dari satu kelas abstrak, jadi dari segi pewarisan tidak ada perbezaan antara kelas abstrak dan biasa. Tidak kira sama ada kita mewarisi daripada kelas abstrak atau daripada kelas biasa, hanya terdapat satu kelas induk.

Mengapa tiada warisan kelas berbilang di Jawa?

Kami telah mengatakan bahawa tidak ada warisan berbilang di Jawa, tetapi kami tidak benar-benar mengetahui sebabnya. Jom cuba ini sekarang. Intinya ialah jika Java mempunyai banyak warisan, kelas kanak-kanak tidak akan dapat menentukan tingkah laku yang hendak dipilih. Katakan kita mempunyai 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, kedua-duanya mempunyai kaedah on(). Dalam kes pembakar roti, ia mula memasak roti bakar, dan dalam kes bom nuklear, ia menyebabkan letupan. Oh :/ Sekarang bayangkan anda memutuskan (saya tidak tahu kenapa tiba-tiba!) untuk mencipta sesuatu di antaranya. Dan inilah kelas anda - MysteriousDevice! Kod ini, sudah tentu, tidak berfungsi, dan kami membentangkannya hanya sebagai contoh "bagaimana ia boleh berlaku":
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 lihat apa yang kami dapat. Peranti misteri itu datang daripada Pembakar Roti dan Bom Nuklear. Kedua-duanya mempunyai kaedah on(), dan akibatnya, kaedah mana on()yang harus menyala pada objek MysteriousDevicejika kita memanggilnya. Objek tidak akan dapat memahami perkara ini. Nah, sebagai ceri pada kek: Bom Nuklear tidak mempunyai kaedah off(), jadi jika kita salah meneka, tidak akan ada cara untuk mematikan peranti. Kelas abstrak di Jawa dengan contoh konkrit - 2 Justru kerana kekeliruan ini, apabila objek tidak jelas tingkah laku mana yang harus dipilih, pencipta Java meninggalkan pelbagai warisan. Walau bagaimanapun, anda masih ingat bahawa kelas Java melaksanakan banyak antara muka. Ngomong-ngomong, anda telah menemui sekurang-kurangnya satu kelas abstrak dalam pengajian anda! Walaupun, mungkin saya tidak perasan :)
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Ini kelas kawan lama awak Calendar. Ia abstrak dan mempunyai beberapa pewaris. Salah satunya ialah GregorianCalendar. Anda sudah menggunakannya dalam pelajaran tentang tarikh :) Semuanya nampak jelas, hanya ada satu perkara lagi: apakah perbezaan asas antara kelas abstrak dan antara muka ? Mengapa mereka menambah kedua-duanya ke Java, dan tidak mengehadkan diri mereka kepada hanya satu? Ini sudah cukup. Kita akan membincangkan perkara ini dalam kuliah seterusnya! jumpa lagi :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION