Setiap versi Java baharu berbeza daripada versi sebelumnya. Sebagai contoh perubahan sedemikian daripada bahan yang telah kami bincangkan, bahasa itu tidak ada
Hanya begitu, Java 8 nyata berbeza daripada Java 7. Kami tidak akan mengabaikan inovasi penting, sudah tentu. Memandangkan kita bercakap tentang antara muka dalam pelajaran ini, mari kita pertimbangkan satu kemas kini kepada bahasa: kaedah lalai dalam antara muka . Anda sudah tahu bahawa antara muka tidak melaksanakan tingkah laku . Tujuannya adalah untuk menerangkan tingkah laku yang mesti wujud dalam semua objek yang melaksanakan antara muka . Tetapi pembangun sering menghadapi situasi di mana pelaksanaan kaedah adalah sama dalam semua kelas. Mari lihat contoh kereta lama kami:
enums
sebelum Java 5.

public interface Car {
public void gas();
public void brake();
}
public class Sedan implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class Truck implements Car {
@Override
public void go() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class F1Car implements Car {
@Override
public void go() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
Pada pendapat anda, apakah masalah utama dengan kod ini? Anda mungkin perasan bahawa kami telah menulis sekumpulan kod pendua! Ini adalah masalah biasa dalam pengaturcaraan dan ia harus dielakkan. Perkara lain ialah tiada penyelesaian tertentu sebelum keluaran Java 8. Apabila versi itu keluar, ia menjadi mungkin untuk menentukan kaedah lalai dan melaksanakannya terus di dalam antara muka! Begini cara melakukannya:
public interface Car {
public default void gas() {
System.out.println("Gas!");
}
public default void brake() {
System.out.println("Brake!");
}
}
public class Sedan implements Car {
}
public class Truck implements Car {
}
public class F1Car implements Car {
}
Kini kaedah gas()
dan brake()
, yang sama untuk semua kereta, telah dipindahkan ke antara muka, menghapuskan keperluan untuk kod pendua. Dan kaedahnya tersedia dalam setiap kelas!
public class Main {
public static void main(String[] args) {
F1Car f1Car = new F1Car();
Sedan sedan = new Sedan();
Truck truck = new Truck();
truck.gas();
sedan.gas();
f1Car.brake();
}
}
Bagaimana jika terdapat 100 kelas dengan gas()
kaedah, tetapi hanya 99 daripadanya harus mempunyai tingkah laku yang sama? Adakah itu merosakkan segala-galanya? Adakah kaedah lalai tidak akan berfungsi dalam kes ini? Sudah tentu tidak :) Kaedah antara muka lalai boleh ditindih.
public class UnusualCar implements Car {
@Override
public void go() {
System.out.println("This car accelerates differently!");
}
@Override
public void brake() {
System.out.println("This car slows down differently!");
}
}
Semua 99 jenis kereta lain akan menggunakan kaedah lalai, manakalaUnusualCar
kelas adalah pengecualian. Tanpa merosakkan gambaran besar, ia dengan tenang akan menentukan tingkah lakunya sendiri. Warisan berbilang dalam antara muka. Seperti yang anda sedia maklum, tiada warisan berbilang di Jawa. Terdapat banyak sebab untuk ini. Kami akan mempertimbangkannya secara terperinci dalam pelajaran berasingan. Dalam bahasa lain, seperti C++, keadaan diterbalikkan. Tiada warisan berbilang memberikan cabaran yang serius, kerana objek yang sama boleh mempunyai beberapa ciri dan tingkah laku yang berbeza. Sebagai contoh, kita adalah anak kepada ibu bapa kita, pelajar kepada guru kita, dan pesakit kepada doktor kita. Dalam kehidupan sebenar, kita mengisi pelbagai peranan dan, oleh itu, berkelakuan berbeza: jelas sekali kita berinteraksi dengan guru secara berbeza berbanding dengan rakan rapat. Mari cuba menterjemah situasi ini kepada kod. Bayangkan kita mempunyai dua kelas: Pond dan Aviary. Kolam memerlukan burung berenang, manakala kandang burung memerlukan burung terbang. Untuk mewakili ini, kami mencipta dua kelas asas:FlyingBird
dan Waterfowl
.
public class Waterfowl {
}
public class FlyingBird {
}
Sehubungan itu, kami akan menghantar burung yang mewarisi FlyingBird
ke kandang burung, manakala yang berasal dari Waterfowl
akan pergi ke kolam. Semuanya nampak mudah. Tetapi apa yang perlu kita lakukan jika kita perlu menentukan itik di suatu tempat? Itik berenang dan terbang. Tetapi kami tidak mempunyai banyak warisan. Nasib baik, Java menyokong pelbagai pelaksanaan antara muka. Jika kelas tidak boleh mewarisi berbilang ibu bapa, melaksanakan berbilang antara muka adalah mudah! Itik kita boleh menjadi burung terbang dan juga burung berenang :) Untuk mencapai hasil yang diinginkan, apa yang perlu kita lakukan ialah membuat FlyingBird
dan Waterfowl
antara muka dan bukannya kelas.
public class Duck implements FlyingBird, Waterfowl {
// Methods of both interfaces combine easily into one class
@Override
public void fly() {
System.out.println("Flying!");
}
@Override
public void swim() {
System.out.println("Swimming!");
}
}
Ini bermakna program kami mengekalkan keupayaan untuk mengurus kelas secara fleksibel. Apabila kita menggabungkannya dengan kaedah lalai, keupayaan kita untuk menentukan tingkah laku objek menjadi hampir tidak terhad! :)
GO TO FULL VERSION