1. Arayüzlerin tanıtılması

Bugün bilgi edinme gününüz. Bir diğer yeni ve ilginç konu ise arayüzler.

Arayüz kavramı, soyutlama ve çok biçimlilik ilkelerinin çocuğudur. Bir arabirim, tüm yöntemlerin soyut olduğu soyut bir sınıfa çok benzer. Bir sınıfla aynı şekilde bildirilir, ancak biz interfaceanahtar kelimeyi kullanırız.

interface Feline
{
   void purr();
   void meow();
   void growl();
}

Arayüzler hakkında bazı yararlı gerçekler şunlardır:

1. Arayüz bildirme

interface Drawable
{
   void draw();
}

interface HasValue
{
   int getValue();
}
  1. Anahtar kelime yerine classyazıyoruz interface.
  2. Yalnızca soyut yöntemler içerir (anahtar kelimeyi yazmayın abstract)
  3. Aslında, arayüzler tümpublic yöntemlere sahiptir.
2. Arayüz kalıtımı

Bir arabirim yalnızca arabirimleri devralabilir. Ancak bir arayüzün birçok ebeveyni olabilir. Bunu söylemenin başka bir yolu, Java'nın birden çok arabirim mirasına sahip olduğunu söylemektir. Örnekler:

interface Piece extends Drawable, HasValue
{
   int getX();
   int getY();
}

3. Arayüzlerden sınıfları devralma

Bir sınıf, birden çok arabirimi miras alabilir (yalnızca bir sınıftan). Bu, anahtar kelime kullanılarak yapılır implements. Örnek:

abstract class ChessItem implements Drawable, HasValue
{
   private int x, y, value;
   public int getValue()
   {
      return value;
   }

   public int getX()
   {
      return x;
   }

   public  int getY()
   {
      return y;
   }
}

ChessItem sınıfı soyut olarak bildirilir: draw. Başka bir deyişle, ChessItemsınıf bir soyut yöntem içerir — draw().

extendsve anahtar kelimelerinin teknik anlamı implementsaynıdır: her ikisi de kalıtımdır. Ayrım, kodun okunabilirliğini artırmak için yapılmıştır. extendsAyrıca sınıfların miras alındığını (via ile ) ve arayüzlerin uygulandığını (via ile implements) söylüyoruz.

4. Değişkenler

İşte en önemli şey: sıradan değişkenler arabirimlerde bildirilemez (statik olanlar yapsa da).

Peki neden arayüzlere ihtiyacımız var? Ne zaman kullanılırlar? Arayüzlerin sınıflara göre iki güçlü avantajı vardır:



2. "Yöntemlerin açıklamasını" uygulamalarından ayırmak.

Daha önce, sınıfınızın metotlarının diğer sınıflardan çağrılmasına izin vermek istiyorsanız, metotlarınızın anahtar kelime ile işaretlenmesi gerektiğinipublic söylemiştik . Bu yöntemlerden bazılarının yalnızca kendi sınıfınızdan çağrılmasını istiyorsanız, bunları anahtar kelimeyle işaretlemeniz gerekir private. Başka bir deyişle, sınıfın yöntemlerini "herkesin kullanması için" ve "yalnızca kendi kullanımımız için" olmak üzere iki kategoriye ayırıyoruz.

Arayüzler bu bölünmeyi daha da güçlendirmeye yardımcı olur. "Herkesin kullanması için özel bir sınıf" ve birinci sınıfı devralacak "yalnızca kendi kullanımımız için" ikinci bir sınıf yapacağız. İşte kabaca nasıl görüneceği:

Önce Sonrasında
class Student
{
   private String name;
   public Student(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return this.name;
   }

   private void setName(String name)
   {
      this.name = name;
   }
interface Student
{
   public String getName();
}

class StudentImpl implements Student
{
   private String name;
   public StudentImpl(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return this.name;
   }

   private void setName(String name)
   {
      this.name = name;
   }
}
public static void main(String[] args)
{
   Student student = new Student("Alibaba");
   System.out.println(student.getName());
}
public static void main(String[] args)
{
   Student student = new StudentImpl("Ali")
   System.out.println(student.getName());
}

Sınıfımızı ikiye ayırdık: bir arayüz ve arayüzü miras alan bir sınıf . Ve buradaki avantaj nedir?

Birçok farklı sınıf, aynı arabirimi uygulayabilir (devralabilir). Ve her birinin kendi davranışı olabilir. Örneğin, ArrayList LinkedListarayüzün iki farklı uygulaması vardır List.

Böylece, sadece çeşitli uygulamaları değil, aynı zamanda uygulayıcı sınıfın kendisini de gizleriz (çünkü kodda sadece arayüze ihtiyacımız var). Bu, çok esnek olmamızı sağlar: program çalışırken, bir nesneyi diğeriyle değiştirebilir, onu kullanan tüm sınıfları etkilemeden bir nesnenin davranışını değiştirebiliriz.

Bu, polimorfizm ile birleştirildiğinde çok güçlü bir tekniktir. Şimdilik, bunu neden yapmanız gerektiği açık olmaktan çok uzak. Arayüzlerin hayatınızı onlarsız olduğundan çok daha kolay hale getirebileceğini anlamak için önce onlarca veya yüzlerce sınıfı olan programlarla karşılaşmanız gerekir.


3. Çoklu kalıtım

Java'da, tüm sınıfların yalnızca bir üst sınıfı olabilir. Diğer programlama dillerinde, sınıflar genellikle birden fazla ebeveyn sınıfına sahip olabilir. Bu çok uygundur, ancak birçok sorunu da beraberinde getirir.

Java'nın yaratıcıları bir uzlaşmaya vardılar: sınıfların çoklu kalıtımını yasakladılar, ancak arayüzlerin çoklu kalıtımına izin verdiler. Bir arayüzün birden fazla ebeveyn arayüzü olabilir. Bir sınıfın birden çok üst arabirimi olabilir, ancak yalnızca bir üst sınıf olabilir.

Neden çoklu sınıf kalıtımını yasakladılar, ancak arayüzlerin çoklu kalıtımına izin verdiler? Sözde elmas kalıtım sorunu nedeniyle:

çoklu kalıtım

B sınıfı, A sınıfını miras aldığında, C ve D sınıfları hakkında hiçbir şey bilmez. Böylece A sınıfının değişkenlerini uygun gördüğü şekilde kullanır. C sınıfı da aynısını yapar: A sınıfının değişkenlerini kullanır, ancak farklı bir şekilde. Ve tüm bunlar D sınıfında bir çatışmaya neden olur.

Aşağıdaki basit örneğe bakalım. Diyelim ki 3 sınıfımız var:

class Data
{
   protected int value;
}
class XCoordinate extends Data
{
   public void setX (int x) { value = x;}
   public int getX () { return value;}
}
class YCoordinate extends Data
{
   public void setY (int y) { value = y;}
   public int getY () { return value; }
}

Data sınıfı, değişkeni depolar value. XCoordinate alt sınıfı, değeri depolamak için bu değişkeni kullanır xve YCoordinatealt sınıf, değeri depolamak için onu kullanır y.

Ve çalışıyor. Ayrı ayrı. XCoordinateAncak, XYCoordinates sınıfının hem ve hem de sınıfları miras almasını istiyorsak YCoordinate, bozuk kod elde ederiz. Bu sınıf, ata sınıflarının yöntemlerine sahip olacak, ancak aynı value variable.

Ancak arabirimlerin değişkenleri olamayacağı için bu tür bir çatışmaya sahip olamazlar. Buna göre, arayüzlerin çoklu kalıtımına izin verilir.