1. Apa metode default dan mengapa harus ada metode default?
Sederhananya, sebuah antarmuka dapat memiliki metode implementasi, dan kelas implementasi tidak diperlukan untuk mengimplementasikan metodenya. Cukup tambahkan kata kunci default di depan nama metode.
Mengapa kita memerlukan fitur ini? Pertama-tama, antarmuka sebelumnya adalah pedang bermata dua. Keuntungannya adalah berorientasi pada abstraksi daripada pemrograman tertentu. Kerugiannya adalah ketika antarmuka perlu dimodifikasi, semua kelas yang mengimplementasikan antarmuka perlu dimodifikasi . Kerangka pengumpulan saat ini sebelum Java 8 tidak memiliki metode foreach. Solusi yang biasanya dapat dilakukan adalah menambahkan metode dan implementasi baru ke antarmuka yang relevan di JDK. Namun, untuk versi rilis, tidak ada cara untuk menambahkan metode baru ke antarmuka tanpa mempengaruhi implementasi yang sudah ada. Jadi metode default diperkenalkan. Tujuannya adalah untuk memecahkan masalah ketidakcocokan antara modifikasi antarmuka dan implementasi yang ada.
Contoh sederhana: antarmuka A, kelas Clazz mengimplementasikan antarmuka A.
Copy kode kodenya sebagai berikut:
antarmuka publik A {
default batal foo(){
System.out.println("Memanggil A.foo()");
}
}
kelas publik Clazz mengimplementasikan A {
public static void main(String[] args){
Clazz clazz = new Clazz();
clazz.foo();//Panggil A.foo()
}
}
Kode dikompilasi meskipun kelas Clazz tidak mengimplementasikan metode foo(). Implementasi default metode foo() disediakan di antarmuka A.
2. Perbandingan antara kelas abstrak dan antarmuka di Java 8
Setelah fitur fungsional ini keluar, banyak siswa yang bereaksi. Antarmuka Java 8 memiliki metode implementasi. Sebenarnya masih ada beberapa, silahkan lihat tabel dibawah ini untuk perbandingannya. .
| Kesamaan | Perbedaan |
1. Semuanya adalah tipe abstrak; 2. Semua dapat memiliki metode implementasi (antarmuka tidak berfungsi sebelumnya); 3. Anda dapat mengimplementasikan semua metode tanpa mengimplementasikan kelas atau pewaris (sebelumnya hal ini tidak mungkin dilakukan, sekarang metode default di antarmuka tidak perlu diimplementasikan oleh pelaksana) | 1. Kelas abstrak tidak boleh memiliki pewarisan berganda, antarmuka bisa (apakah itu pewarisan tipe berganda atau pewarisan perilaku berganda); 2. Kelas abstrak dan antarmuka mencerminkan konsep desain yang berbeda. Faktanya, kelas abstrak mewakili hubungan "is-a", dan antarmuka mewakili hubungan "seperti-a"; 3. Variabel yang didefinisikan dalam antarmuka default ke tipe akhir statis publik, dan nilai awalnya harus diberikan, sehingga tidak dapat didefinisikan ulang di kelas implementasi, juga nilainya tidak dapat diubah di kelas abstrak default ke tipe ramah, dan nilainya dapat ditentukan di subkelas. Itu dapat didefinisikan ulang di kelas atau ditugaskan kembali. |
3. Deskripsi Konflik Warisan Berganda
Karena metode yang sama dapat diperkenalkan dari antarmuka yang berbeda, konflik akan terjadi secara alami. Aturan untuk menentukan konflik dengan metode default adalah sebagai berikut:
1. Metode yang dideklarasikan dalam suatu kelas lebih diutamakan daripada metode default apa pun (kelas selalu menang)
2. Jika tidak, implementasi yang paling spesifik akan dipilih terlebih dahulu. Misalnya, pada contoh di bawah, B menulis ulang metode hello A.
Outputnya adalah: Hello World dari B
Jika Anda ingin memanggil fungsi default A, gunakan sintaks baru X.super.m(...). Selanjutnya, modifikasi kelas C, implementasikan antarmuka A, dan tulis ulang metode hello, seperti yang ditunjukkan di bawah ini:
Copy kode kodenya sebagai berikut:
kelas publik C mengimplementasikan A{
@Mengesampingkan
kekosongan publik halo(){
A.super.halo();
}
public static void main(String[] args){
C() baru.halo();
}
}
Outputnya adalah: Hello World dari A
4. Ringkasan
Metode default memberi kita kemudahan untuk memodifikasi antarmuka tanpa merusak struktur kelas implementasi asli. Saat ini, kerangka kumpulan Java 8 telah banyak menggunakan metode default untuk memperbaikinya Java 8, disediakan untuk Kami memiliki pengalaman transisi yang lancar. Mungkin kita akan melihat lebih banyak penerapan metode default dalam desain API di masa mendatang.