Setiap versi Java baharu berbeza daripada versi sebelumnya. Sebagai contoh perubahan sedemikian daripada bahan yang telah kami bincangkan, bahasa itu tidak ada enumssebelum Java 5.
Kaedah lalai dalam antara muka - 1
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:

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, manakalaUnusualCarkelas 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:FlyingBirddan Waterfowl.

public class Waterfowl {
}

public class FlyingBird {
}
Sehubungan itu, kami akan menghantar burung yang mewarisi FlyingBirdke kandang burung, manakala yang berasal dari Waterfowlakan 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 FlyingBirddan Waterfowlantara 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! :)