Kelas abstrak ialah kelas yang diisytiharkan dalam Java melalui kata kunci "Abstrak". Kelas abstrak ialah konsep dalam salah satu daripada empat prinsip pengaturcaraan berorientasikan objek (OOP) yang dipanggil "warisan." Warisan merujuk kepada ciri kelas Java di mana kelas yang dipanggil "subkelas" mewarisi semua sifat kelas. Kelas induk sering dipanggil "kelas super".
Di Java, kelas abstrak merujuk kepada kelas super asas yang boleh diwarisi oleh subkelas lain. Ia boleh mengandungi kedua-dua kaedah abstrak dan bukan abstrak.
Langkah 1 - Kenal pasti kaedah dalam kelas yang mempunyai pelaksanaan lalai atau tiada pelaksanaan.
Langkah 2 - Alih keluar pelaksanaan kaedah ini.
Langkah 3 - Tambahkan kata kunci abstrak pada pengisytiharan kelas.
Langkah 4 - Tambahkan kata kunci abstrak pada pengisytiharan kaedah yang diubah suai dalam Langkah 2.
Langkah 5 - Jika kelas mempunyai sebarang pembolehubah contoh yang perlu dimulakan, tambahkan pembina untuk memulakannya.
Langkah 6 - Kemas kini mana-mana subkelas kelas abstrak untuk melaksanakan kaedah abstrak atau menjadikannya abstrak.
Mari kita lihat sintaks untuk membuat contoh kelas abstrak dalam Java -
// Abstract Class abstract class Shape { public abstract void draw(); }
Memandangkan kelas abstrak adalah kelas yang tidak lengkap, ia tidak boleh digunakan secara langsung menggunakan kata kunci "baharu".
Subkelas Konkrit - Untuk membuat instantiat kelas abstrak yang samar-samar atau tidak lengkap, terdapat pilihan untuk menggunakan subkelas konkrit. Dengan lancar melanjutkan daripada abstraksi induk ini dan melaksanakan setiap keperluan kaedahnya, pengguna boleh berjaya mencipta dan melaksanakan subkelas yang baru instantiated ini tanpa ralat atau ketidakkonsistenan dalam pengendaliannya.
Lambda Expression - Untuk mencipta objek daripada kelas abstrak, anda mempunyai pilihan lain - gunakan ungkapan lambda yang menyediakan pelaksanaan untuk semua abstraksinya. Penciptaan lambda ini kemudiannya diberikan kepada pembolehubah antara muka berfungsi yang serasi berdasarkan tandatangan ini.
Mari lihat contoh coretan kod untuk memahami penggunaan kelas abstrak. Senario pertama menyediakan kod dengan kelas bukan abstrak.
class Shape { public void printName() { System.out.println("I'm a shape"); } public float area() { return 0; } public void printDetails() { this.printName(); System.out.println("... and my area is " + this.area()); } } class Circle extends Shape { private float radius; public Circle(float radius) { this.radius = radius; } public void printName() { System.out.println("I'm a circle"); } public float area() { return (float) (Math.PI * Math.pow(radius, 2)); } } class Rectangle extends Shape { private float length; private float width; public Rectangle(float length, float width) { this.length = length; this.width = width; } public void printName() { System.out.println("I'm a rectangle"); } public float area() { return length * width; } } public class Main { public static void main(String[] args) { Shape[] shapes = { new Circle(3.5f), new Rectangle(4.0f, 5.0f) }; for (Shape shape : shapes) { shape.printDetails(); } } }
I'm a circle ... and my area is 38.48451 I'm a rectangle ... and my area is 20.0
Kedua-dua kelas Circle dan Rectangle mewarisi kaedah printName(), area() dan printDetails() daripada superclass "Shape". Walau bagaimanapun, kedua-dua kelas tidak mengatasi kaedah kawasan() untuk menyediakan pelaksanaannya sendiri.
Dengan memanggil kaedah printDetails() objek Bulatan, output akan menjadi "Saya adalah bulatan...dan kawasan saya ialah 38.48451". Begitu juga, memanggil kaedah printDetails() pada objek Rectangle akan mencetak "Saya adalah segi empat tepat...dan kawasan saya ialah 20.0". Ini memastikan bahawa output mencerminkan bentuk yang betul dan kawasan yang sepadan mengikut pelaksanaan khusus yang disediakan dalam setiap kelas
// With abstract class abstract class Shape { public abstract void printName(); public abstract float area(); public void printDetails() { this.printName(); System.out.println("... and my area is " + this.area()); } } // Concrete class class Circle extends Shape { private float radius; public Circle(float radius) { this.radius = radius; } public void printName() { System.out.print("I'm a circle"); } public float area() { return (float) (Math.PI * Math.pow(radius, 2)); } } // Concrete class class Rectangle extends Shape { private float length; private float width; public Rectangle(float length, float width) { this.length = length; this.width = width; } public void printName() { System.out.print("I'm a rectangle"); } public float area() { return length * width; } } // Main class public class Main { public static void main(String[] args) { Shape[] shapes = { new Circle(10), new Rectangle(5, 10) }; for (Shape shape : shapes) { shape.printDetails(); } } }
I'm a circle... and my area is 314.15927 I'm a rectangle... and my area is 50.0
Dalam kod yang dikemas kini di atas, kelas Circle dan Rectangle melaksanakan kaedah abstrak printName() dan area() yang ditakrifkan dalam kelas abstrak "Shape". Kaedah printDetails() dalam kelas Shape boleh menggunakan kaedah ini untuk mencetak nama bentuk dan kawasan masing-masing.
Dengan menjadikan Shape sebagai kelas abstrak dan mentakrifkan kaedah abstrak, kami memastikan mana-mana kelas yang melanjutkan kelas Shape mesti menyediakan pelaksanaannya sendiri untuk kaedah printName() dan area().
interface Nameable { String getName(); } abstract class Shape { private Nameable nameable; public Shape(Nameable nameable) { this.nameable = nameable; } public abstract float area(); public void printDetails() { System.out.println("I'm a " + nameable.getName() + " ... and my area is " + this.area()); } } class Circle extends Shape { private float radius; public Circle(float radius) { super(() -> "circle"); this.radius = radius; } @Override public float area() { return (float) (Math.PI * Math.pow(radius, 2)); } } class Rectangle extends Shape { private float width; private float height; public Rectangle(float width, float height) { super(() -> "rectangle"); this.width = width; this.height = height; } @Override public float area() { return width * height; } } public class Main { public static void main(String[] args) { Shape[] shapes = { new Circle(10), new Rectangle(5, 10) }; for (Shape shape : shapes) { shape.printDetails(); } } }
I'm a circle ... and my area is 314.15927 I'm a rectangle ... and my area is 50.0
Dalam kemas kini terbaharu kod ini, kami telah memperkenalkan cara yang lebih baik untuk menentukan Shape sebagai kelas abstrak sambil menghayati fungsi getName()nya. Penambahbaikan selanjutnya melibatkan penyepaduan kaedah printName, yang berjaya menggunakan data daripada getName() untuk memaparkan nama setiap bentuk yang sepadan. Untuk subkelas Circle dan Rectangle - mereka kini mengatasi getName yang sepadan menggunakan ungkapan lambda supaya bentuk yang dijangka dikenal pasti dengan tepat.
Ringkasnya, kelas abstrak hanya boleh digunakan melalui subkelas asasnya, bukan secara langsung. Ini adalah konsep yang diwarisi.
Sebab utama di sebalik ini ialah kelas abstrak bukanlah pelaksanaan lengkap kaedah dan objeknya, tetapi digunakan oleh subkelas untuk mewarisinya.
Atas ialah kandungan terperinci Bagaimana cara membuat kelas abstrak di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!