Antara muka dan kelas abstrak ialah komponen penting untuk mencapai abstraksi dan polimorfisme.
Antara muka dalam Java ialah jenis rujukan, serupa dengan kelas, yang boleh mengandungi hanya kaedah abstrak, kaedah statik, kaedah lalai dan pembolehubah akhir statik (pemalar). Antara muka digunakan untuk mencapai abstraksi dan warisan berbilang dalam Java. Antara muka mungkin tidak boleh dibuat secara langsung.
?Sebelum Java 8, antara muka hanya boleh mempunyai kaedah abstrak.
Pelaksanaan kaedah ini perlu disediakan dalam kelas yang berasingan. Jadi, jika kaedah baharu hendak ditambah dalam antara muka, maka kod pelaksanaannya perlu disediakan dalam kelas yang melaksanakan antara muka yang sama.
?Untuk mengatasi isu ini, Java 8 telah memperkenalkan konsep kaedah lalai yang membolehkan antara muka mempunyai kaedah dengan pelaksanaan tanpa menjejaskan kelas yang melaksanakan antara muka .
Kaedah lalai boleh ditindih dengan melaksanakan kelas jika perlu.
Kelas abstrak dalam Java ialah kelas yang tidak boleh dibuat instantiat sendiri dan mungkin mengandungi kaedah abstrak (kaedah tanpa badan) dan kaedah konkrit (kaedah dengan badan). Kelas abstrak digunakan untuk menyediakan asas yang sama untuk subkelas, membenarkan penggunaan semula kod dan takrifan tingkah laku yang dikongsi.
Java hanya menyokong warisan tunggal, bermakna setiap kelas boleh mewarisi medan dan kaedah hanya satu kelas. Jika anda perlu mewarisi sifat daripada lebih daripada satu sumber, Java menyediakan konsep antara muka, iaitu satu bentuk warisan berbilang.
?Antara muka adalah serupa dengan kelas. Walau bagaimanapun, mereka hanya mentakrifkan tandatangan kaedah dan bukan pelaksanaannya. Kaedah yang diisytiharkan dalam antara muka dilaksanakan dalam kelas. Pewarisan berbilang berlaku apabila kelas melaksanakan berbilang antara muka.
Di Java, warisan berbilang dicapai melalui antara muka dan bukannya kelas. Ini membolehkan kelas untuk melaksanakan berbilang antara muka, mewarisi tandatangan kaedah daripada setiap satu daripadanya. Di bawah ialah contoh yang menunjukkan berbilang warisan menggunakan antara muka.
Mari kita tentukan dua antara muka, Boleh Terbang dan Boleh Renang, dan Itik kelas yang melaksanakan kedua-dua antara muka.
public interface Flyable { void fly(); }
public interface Swimmable { void swim(); }
public class Duck implements Flyable, Swimmable { @Override public void fly() { System.out.println("Duck is flying"); } @Override public void swim() { System.out.println("Duck is swimming"); } public static void main(String[] args) { Duck duck = new Duck(); duck.fly(); duck.swim(); } }
Antaramuka:
Kelas:
Kaedah Utama:
Duck is flying Duck is swimming
Berikut ialah rajah ringkas untuk menggambarkan perhubungan:
+----------------+ | Flyable |<--------------->Interface |----------------| | + fly() | +----------------+ ^ | | Implements | +----------------+ | Duck |<--------------->Class |----------------| | + fly() | | + swim() | +----------------+ ^ | | Implements | +----------------+ | Swimmable |<--------------->Interface |----------------| | + swim() | +----------------+
Dalam contoh ini, kelas Itik menunjukkan berbilang warisan dengan melaksanakan kedua-dua antara muka Boleh Terbang dan Boleh Renang. Ini membolehkan kelas Duck mewarisi dan menyediakan pelaksanaan untuk kaedah yang ditakrifkan dalam kedua-dua antara muka, mempamerkan cara Java mencapai warisan berbilang melalui antara muka.
Kelas abstrak dalam Java digunakan untuk menyediakan asas yang sama untuk keluarga kelas yang berkaitan. Ia boleh mengandungi kedua-dua kaedah abstrak (kaedah tanpa badan) dan kaedah konkrit (kaedah dengan badan). Di bawah ialah contoh yang menunjukkan penggunaan kelas abstrak.
Mari kita tentukan kelas abstrak Haiwan dan dua subkelas Anjing dan Kucing yang memanjangkan kelas Haiwan.
public abstract class Animal { // Abstract method (does not have a body) public abstract void makeSound(); // Concrete method (has a body) public void sleep() { System.out.println("The animal is sleeping"); } }
public class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog says: Woof!"); } public static void main(String[] args) { Dog dog = new Dog(); dog.makeSound(); dog.sleep(); } }
public class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat says: Meow!"); } public static void main(String[] args) { Cat cat = new Cat(); cat.makeSound(); cat.sleep(); } }
Kelas Abstrak: Haiwan
Subkelas: Anjing
Subkelas: Kucing
Untuk kelas Anjing:
public interface Flyable { void fly(); }
Untuk kelas Kucing:
public interface Swimmable { void swim(); }
Berikut ialah rajah ringkas untuk menggambarkan perhubungan:
public class Duck implements Flyable, Swimmable { @Override public void fly() { System.out.println("Duck is flying"); } @Override public void swim() { System.out.println("Duck is swimming"); } public static void main(String[] args) { Duck duck = new Duck(); duck.fly(); duck.swim(); } }
Dalam contoh ini, kelas abstrak Haiwan menyediakan asas yang sama untuk subkelas Anjing dan Kucing. Kelas Haiwan mentakrifkan kaedah abstrak makeSound() yang mesti dilaksanakan oleh mana-mana subkelas, dan kaedah konkrit sleep() yang menyediakan pelaksanaan lalai. Kelas Anjing dan Kucing memanjangkan kelas Haiwan dan menyediakan pelaksanaan kaedah makeSound() mereka sendiri.
Duck is flying Duck is swimming
Antara muka biasanya digunakan untuk mentakrifkan API, rangka kerja dan perpustakaan. Contohnya, antara muka java.util.List menyediakan kontrak untuk pelaksanaan senarai, seperti ArrayList dan LinkedList.
+----------------+ | Flyable |<--------------->Interface |----------------| | + fly() | +----------------+ ^ | | Implements | +----------------+ | Duck |<--------------->Class |----------------| | + fly() | | + swim() | +----------------+ ^ | | Implements | +----------------+ | Swimmable |<--------------->Interface |----------------| | + swim() | +----------------+
Kelas abstrak sering digunakan untuk menyediakan kelas asas untuk keluarga kelas yang berkaitan. Contohnya, kelas java.util.AbstractList menyediakan pelaksanaan rangka bagi antara muka Senarai, mengurangkan jumlah kod yang perlu dilaksanakan oleh subkelas.
public interface Flyable { void fly(); }
SNo | Interface | Abstract Class |
---|---|---|
1 | Interfaces cannot be instantiated | Abstract classes cannot be instantiated |
2 | It can have both abstract and non-abstract methods | It can have both abstract and non-abstract methods |
3 | In interfaces, all fields are automatically public, static, and final, and all methods that you declare or define (as default methods) are public | In abstract classes, you can declare fields that are not static and final, and define public, protected, and private concrete methods |
4 | Interface supports multiple inheritance. Multiple interfaces can be implemented | Abstract class or class can extend only one class |
5 | It is used if you expect that unrelated classes would implement your interface. Eg, the interfaces Comparable and Cloneable are implemented by many unrelated classes | It is used if you want to share code among several closely related classes |
6 | It is used if you want to specify the behavior of a particular data type, but not concerned about who implements its behavior. | It is used if you expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private) |
Ruj: https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
Apabila kelas abstrak disubkelaskan, subkelas biasanya menyediakan pelaksanaan untuk semua kaedah abstrak dalam kelas induknya. Walau bagaimanapun, jika tidak, maka subkelas juga mesti diisytiharkan abstrak.
Menurut Joshua Bloch, pengarang "Effective Java," antara muka diutamakan berbanding kelas abstrak untuk menentukan jenis kerana ia lebih fleksibel dan menyokong pelbagai warisan. Walau bagaimanapun, kelas abstrak berguna untuk menyediakan fungsi dikongsi dan mengurangkan pertindihan kod.
"Antara muka sesuai untuk mentakrifkan campuran. Sebaliknya, kelas sesuai untuk menentukan objek yang mempunyai sifat intrinsik."
- Joshua Bloch
Terokai kuasa antara muka dan kelas abstrak dalam projek Java anda sendiri. Eksperimen dengan mentakrifkan kontrak menggunakan antara muka dan menyediakan kefungsian dikongsi menggunakan kelas abstrak. Kongsi pandangan dan pengalaman anda dengan komuniti Java untuk menyumbang kepada pengetahuan dan pertumbuhan kolektif.
Sebarang pembetulan atau penambahan pada siaran ini dialu-alukan.
public interface Flyable { void fly(); }
Atas ialah kandungan terperinci Antara Muka dan Kelas Abstrak di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!