Dalam konsep OOP, semua objek diterangkan melalui kelas tetapi tidak semua kelas digunakan untuk menerangkan objek. Jika kelas tidak mengandungi maklumat yang mencukupi untuk menerangkan objek konkrit, kelas sedemikian dipanggil kelas abstrak.
Kelas abstrak: (1) Kelas abstrak tidak boleh membuat seketika objek. Hanya subkelas bukan abstrak bagi kelas abstrak boleh mencipta objek (2) yang boleh merangkumi: pembolehubah ahli, kaedah ahli, pembina, dsb. (3) Pembina dan kaedah kelas (kaedah diubah suai dengan statik) tidak boleh diisytiharkan sebagai kaedah abstrak
Kaedah abstrak: (1) Jika kelas mengandungi kaedah abstrak, maka kelas mestilah kelas abstrak (2) Mana-mana Subkelas mesti mengatasi kaedah abstrak kelas induk, atau mengisytiharkan diri mereka sebagai kelas abstrak
Definisi: nama kelas kelas abstrak
Haiwan : Kelas abstrak--------getName(), move(), drink()
Reptilia, Mamalia: Mewarisi kelas abstrak
Ular, harimau, kambing, arnab: mewarisi masing-masing Reptilia atau Mamalia
fammer: bringWater(), feedWater(Animal animal)---- Bertanggungjawab membawa air ke tempat yang ditetapkan, dan kemudian haiwan itu bergerak ke destinasi dan minum air
Kodnya adalah seperti berikut:
package abstractDemo; /** * @author lpx * @Description TODO * @date 2021-04-07 */ public abstract class Animal { abstract String getName(); abstract void move(String destination); abstract void drink(); } abstract class Reptile extends Animal{ } abstract class Mammal extends Animal{ } class Tiger extends Mammal{ private static String name="tiger"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("tiger move to "+destination+"."); } @Override void drink() { System.out.println("tiger lower it is head and drink"); } } class Goat extends Mammal{ private static String name="goat"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("goat move to "+destination+"."); } @Override void drink() { System.out.println("goat lower it head to drink"); } } class Rabbit extends Mammal{ private static String name="rabbit"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("rabbit move to "+destination+"."); } @Override void drink() { System.out.println("rabbit put out it is tongue and drink"); } } class Snake extends Reptile{ private static String name="snake"; @Override String getName() { return this.name; } @Override void move(String destination) { System.out.println("snake move to "+destination+"."); } @Override void drink() { System.out.println("snake dived into and drink"); } } class Farmer{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void feedWater(Animal a){ // polymorphism this.bringWater("Feeding Room"); a.move("Feeding Room"); a.drink(); } } class Test{ public static void main(String[] args) { Farmer fm=new Farmer(); Snake snake=new Snake(); Goat goat=new Goat(); Tiger tiger=new Tiger(); Rabbit rabbit=new Rabbit(); fm.feedWater(snake); fm.feedWater(goat); fm.feedWater(tiger); fm.feedWater(rabbit); } }
Hasil pelaksanaan:
Ringkasan:
Jika setiap haiwan tidak diabstraksikan Untuk kaedah minuman dan bergerak, polimorfisme tidak boleh dicapai. Kelas petani perlu membebankan berbilang feedWaters mengikut parameter yang berbeza. Jika anda terus menambah haiwan, bilangan tambah nilai akan meningkat. Untuk memudahkan perbandingan dan pemahaman, saya juga menulisnya mengikut pemikiran konvensional Kodnya adalah seperti berikut:
package abstractDemo; /** * @author lpx * @Description TODO * @date 2021-04-07 */ class Tiger1{ private static String name="tiger"; String getName() { return this.name; } void move(String destination) { System.out.println("tiger move to "+destination+"."); } void drink() { System.out.println("tiger lower it is head and drink"); } } class Goat1{ private static String name="goat"; String getName() { return this.name; } void move(String destination) { System.out.println("goat move to "+destination+"."); } void drink() { System.out.println("goat lower it head to drink"); } } class Rabbit1{ private static String name="rabbit"; String getName() { return this.name; } void move(String destination) { System.out.println("rabbit move to "+destination+"."); } void drink() { System.out.println("rabbit put out it is tongue and drink"); } } class Farmer1{ public void bringWater(String destination){ System.out.println("Farmer bring water to " + destination + "."); } public void feedWater(Goat1 goat){ // polymorphism this.bringWater("Feeding Room"); goat.move("Feeding Room"); goat.drink(); } public void feedWater(Tiger1 tiger){ // polymorphism this.bringWater("Feeding Room"); tiger.move("Feeding Room"); tiger.drink(); } public void feedWater(Rabbit1 rabbit1) { this.bringWater("Feeding Room"); rabbit1.move("Feeding Room"); rabbit1.drink(); } } public class Test1{ public static void main(String[] args) { Farmer1 farmer1=new Farmer1(); Tiger1 tiger1=new Tiger1(); Goat1 goat1=new Goat1(); Rabbit1 rabbit1=new Rabbit1(); farmer1.feedWater(tiger1); farmer1.feedWater(goat1); farmer1.feedWater(rabbit1); } }
Saya menaip contoh ini dengan tangan dan mendapati bahawa asasnya saya tidak belajar berhati-hati pada masa lalu, yang membawa kepada kekeliruan di banyak tempat Mengapa menulis itu.
(1) Berbilang kelas boleh ditakrifkan dalam fail .java, tetapi hanya satu boleh ditakrifkan sebagai awam dan nama kelas mestilah sama dengan nama fail
(2) Pewarisan kelas abstrak Untuk kelas abstrak, tidak perlu mengatasi kaedah abstraknya (sebabnya juga sangat mudah, ia abstrak dan tidak boleh melaksanakan badan kaedah). Walaupun kelas bukan abstrak mewarisi kelas abstrak mesti mengatasi kaedah abstrak, dan kaedah bukan abstrak tidak diperlukan.
(3) Perbezaan antara menulis semula dan terlebih muatan (soalan temu duga frekuensi tinggi?)
Lebih muatan: tentukan nama kaedah yang sama tetapi parameter berbeza. Ia tergolong dalam polimorfisme masa kompilasi
penulisan semula: subkelas mengatasi kaedah @Override kelas induk. Kepunyaan polimorfisme masa jalan
Atas ialah kandungan terperinci Contoh analisis definisi abstrak Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!