Java'nın her yeni sürümü bir öncekinden farklıdır. enumsEle aldığımız materyallerden böyle bir değişikliğe örnek olarak, Java 5'ten önce dil yoktu .
Arayüzlerdeki varsayılan yöntemler - 1
Aynen öyle, Java 8, Java 7'den belirgin şekilde farklıdır. Önemli yenilikleri elbette göz ardı etmeyeceğiz. Bu derste arayüzlerden bahsettiğimiz için, dile yönelik bir güncellemeyi ele alalım: interfaces'teki varsayılan yöntemler . Bir arayüzün davranışı uygulamadığını zaten biliyorsunuz . Amacı, arabirimi uygulayan tüm nesnelerde hangi davranışın olması gerektiğini açıklamaktır . Ancak geliştiriciler, bir yöntemin uygulanmasının tüm sınıflarda aynı olduğu durumlarla sık sık karşılaştı. Eski araba örneğimize bakalım:
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!");
   }
}
Sizce bu koddaki asıl sorun nedir? Bir sürü yinelenen kod yazdığımızı muhtemelen fark etmişsinizdir! Bu, programlamada yaygın bir sorundur ve bundan kaçınılmalıdır. Java 8'in piyasaya sürülmesinden önce belirli bir çözümün olmaması da başka bir konudur. Bu sürüm çıktığında, varsayılan yöntemleri tanımlamak ve bunları doğrudan bir arayüzün içinde uygulamak mümkün hale geldi! Bunu nasıl yapacağınız aşağıda açıklanmıştır:
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 {

}
Artık tüm arabalar için aynı olan gas()ve brake()yöntemleri arayüze taşınarak, yinelenen kod ihtiyacını ortadan kaldırdı. Ve yöntemler her sınıfta mevcuttur!
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();
   }
}
Ya bir yöntemi olan 100 sınıf varsa gas(), ancak bunlardan yalnızca 99'u aynı davranışa sahipse? Bu her şeyi mahvediyor mu? Bu durumda varsayılan bir yöntem çalışmaz mı? Tabii ki hayır :) Varsayılan arayüz yöntemleri geçersiz kılınabilir.
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!");
   }
}
Diğer tüm 99 araba türü varsayılan yöntemi kullanırken,UnusualCarsınıf bir istisnadır. Büyük resmi bozmadan, sakince kendi davranışını belirleyecektir. Arayüzlerde çoklu kalıtım. Bildiğiniz gibi Java'da çoklu kalıtım yoktur. Bunun için birçok nedeni vardır. Bunları ayrı bir derste ayrıntılı olarak ele alacağız. C++ gibi diğer dillerde durum tersine çevrilir. Aynı nesne birkaç farklı özellik ve davranışa sahip olabileceğinden, çoklu kalıtım ciddi bir sorun oluşturmaz. Örneğin anne-babamız için çocuk, öğretmenlerimiz için öğrenci, doktorlarımız için hastayız. Gerçek hayatta çeşitli roller üstleniriz ve buna bağlı olarak farklı davranırız: açıkçası öğretmenlerle yakın arkadaşlardan farklı şekilde etkileşim kurarız. Bu durumu koda çevirmeye çalışalım. İki sınıfımız olduğunu düşünelim: Pond ve Aviary. Bir göletin yüzen kuşlara, bir kuşhanenin ise uçan kuşlara ihtiyacı vardır. Bunu temsil etmek için iki temel sınıf oluşturduk:FlyingBirdve Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
FlyingBirdBuna göre miras kalan kuşları kafese, türeyenleri ise Waterfowlgölete göndereceğiz . Her şey basit görünüyor. Ama bir yerde ördek tanımlamamız gerekirse ne yapmalıyız? Ördekler hem yüzer hem uçar. Ancak çoklu mirasımız yok. Neyse ki, Java birden çok arabirim uygulamasını destekler. Bir sınıf birden çok ebeveyni miras alamıyorsa, birden çok arabirim uygulamak kolaydır! Ördeğimiz yüzen bir kuş olabileceği gibi uçan bir kuş da olabilir :) İstenilen sonuca ulaşmak için tek yapmamız gereken sınıflardan ziyade yapmak FlyingBirdve arayüzler yapmak.Waterfowl
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!");
   }
}
Bu, programımızın sınıfları esnek bir şekilde yönetme yeteneğini koruduğu anlamına gelir. Bunu varsayılan yöntemlerle birleştirdiğimizde, nesnelerin davranışını belirleme yeteneğimiz neredeyse sınırsız hale geliyor! :)