Arayüz (Java) - Interface (Java)

Bir arabirim içinde Java programlama dili bir olan soyut tip bir davranış belirtmek için kullanılır sınıflar uygulamalıdır. Protokollere benzerler . Arabirimler interface anahtar sözcüğü kullanılarak bildirilir ve yalnızca yöntem imzası ve sabit bildirimler (hem staticve hem olarak bildirilen değişken bildirimleri) içerebilir final. Bir Arabirimin tüm yöntemleri, Java 8'in altındaki tüm sürümlerden itibaren uygulama (yöntem gövdeleri) içermez. Java 8 ile başlayarak defaultve staticyöntemler interfacetanımda uygulamaya sahip olabilir . Ardından, Java 9'da privateve private staticyöntemlere ilave edildi. Şu anda, bir Java arabiriminin altı farklı türü olabilir.

Arayüzler somutlaştırılamaz , bunun yerine uygulanır. Bir arabirim uygulayan bir sınıf, arabirimde açıklanan varsayılan olmayan yöntemlerin tümünü uygulamalı veya soyut bir sınıf olmalıdır . Java'daki nesne referansları, bir arayüz tipinde belirtilebilir; her durumda, ya null olmalı ya da arabirimi uygulayan bir nesneye bağlı olmalıdırlar.

Arabirimleri kullanmanın bir yararı, çoklu kalıtımı simüle etmeleridir . Java'daki tüm sınıflar tam olarak bir temel sınıfa sahip olmalıdır , bunun tek istisnası java.lang.Object( Java tipi sistemin kök sınıfı ); sınıfların çoklu mirasına izin verilmez. Ancak, bir arabirim birden çok arabirimi devralabilir ve bir sınıf birden çok arabirim uygulayabilir.

genel bakış

Arayüzler, çeşitli türlerdeki sınıfların paylaştığı benzerlikleri kodlamak için kullanılır, ancak mutlaka bir sınıf ilişkisi oluşturmaz. Örneğin, bir insan ve bir papağan hem ıslık çalabilir ; ancak, Humans ve Parrots'yi bir Whistlersınıfın alt sınıfları olarak temsil etmek mantıklı olmaz . Bunun yerine, büyük olasılıkla bir Animalsınıfın alt sınıfları olacaklardır (muhtemelen ara sınıflarla), ancak her ikisi de Whistlerarayüzü uygulayacaktır .

Arayüzlerin başka bir kullanımı, bir nesneyi sınıf türünü bilmeden kullanabilmek , bunun yerine yalnızca belirli bir arayüzü uygulayabilmesidir. Örneğin, bir ıslık sesine canı sıkılırsa, bunun insan mı yoksa papağan mı olduğu bilinmeyebilir, çünkü ıslık çalanın ıslık çaldığı belirlenebilir. Çağrı whistler.whistle()uygulanan yöntem arayacak whistlenesnenin whistler, olursa olsun neler sınıf, uygular sağladı Whistler. Daha pratik bir örnekte, bir sıralama algoritması türünde bir nesne bekleyebilir Comparable. Böylece, belirli bir türü bilmeden, o türdeki nesnelerin bir şekilde sıralanabileceğini bilir.

Örneğin:

interface Bounceable {
    double pi = 3.1415;
    void setBounce();  // Note the semicolon
                       // Interface methods are public, abstract and never final.
                       // Think of them as prototypes only; no implementations are allowed.
}

Bir arayüz:

  • yalnızca yöntem başlıklarını ve genel sabitleri bildirir.
  • somutlaştırılamaz.
  • bir sınıf tarafından uygulanabilir.
  • bir sınıfı genişletemez.
  • diğer birkaç arabirimi genişletebilir.

kullanım

Bir arayüz tanımlama

Arayüzler aşağıdaki sözdizimi ile tanımlanır ( Java'nın sınıf tanımıyla karşılaştırın ):

[visibility] interface InterfaceName [extends other interfaces] {
        constant declarations
        abstract method declarations
}

Örnek: public interface Interface1, Interface2'yi genişletir;

Arayüzün gövdesi soyut yöntemler içerir , ancak bir arayüzdeki tüm yöntemler tanım gereği soyut olduğundan, abstractanahtar kelime gerekli değildir. Arabirim bir dizi açıkta kalan davranışı belirttiğinden, tüm yöntemler örtük olarak public.

Böylece, basit bir arayüz olabilir

public interface Predator {
    boolean chasePrey(Prey p);
    void eatPrey(Prey p);
}

Bir arabirimdeki üye türü bildirimleri dolaylı olarak statik, nihai ve geneldir, ancak aksi takdirde herhangi bir sınıf veya arabirim türü olabilir.

Bir sınıfta arayüzleri uygulamak

Bir arabirim uygulamak için sözdizimi şu formülü kullanır:

... implements InterfaceName[, another interface, another, ...] ...

Sınıflar bir arabirim uygulayabilir. Örneğin:

public class Lion implements Predator {

    @Override
    public boolean chasePrey(Prey p) {
           // Programming to chase prey p (specifically for a lion)
    }

    @Override
    public void eatPrey(Prey p) {
           // Programming to eat prey p (specifically for a lion)
    }
}

Bir sınıf bir arabirim uygular ve tüm yöntemlerini uygulamazsa, olarak işaretlenmelidir abstract. Bir sınıf soyutsa , alt sınıflarından birinin uygulanmamış yöntemlerini uygulaması beklenir, ancak soyut sınıfın alt sınıflarından herhangi biri tüm arabirim yöntemlerini uygulamıyorsa, alt sınıfın kendisi yeniden olarak işaretlenmelidir abstract.

Sınıflar birden çok arabirim uygulayabilir:

public class Frog implements Predator, Prey { ... }

Arayüzler ortak sınıf yöntemlerini paylaşabilir:

class Animal implements LikesFood, LikesWater {
    boolean likes() { return true; }
}

Ancak belirli bir sınıf, aynı veya benzer bir arabirimi birden çok kez uygulayamaz:

class Animal implements Shares<Boolean>, Shares<Integer> ...
// Error: repeated interface

Java, sınıfların çoklu mirasına izin vermediğinden veya argüman olarak yöntemlerin (prosedürlerin) geçirilmesine izin vermediğinden, arabirimler Java dilinde geri aramalar için yaygın olarak kullanılır . Bu nedenle, bir yöntemi hedef yönteme parametre olarak geçirmek için mevcut uygulama, birden çok değişken tanımlamak yerine, parametre yönteminin imzasını ve adresini hedef yönteme sağlamanın bir yolu olarak bir arabirime bir referans tanımlamak ve iletmektir. Her olası çağrı sınıfını barındırmak için hedef yöntemin.

alt arayüzler

Arayüzler, aşağıda açıklandığı gibi aynı formülü kullanarak birkaç başka arayüzü genişletebilir. Örneğin,

public interface VenomousPredator extends Predator, Venomous {
    // Interface body
}

yasaldır ve bir alt arayüz tanımlar. Sınıflardan farklı olarak çoklu kalıtım sağlar. Predatorve Venomousmuhtemelen aynı imzaya sahip yöntemleri tanımlayabilir veya devralabilir, örneğin kill(Prey p). Bir sınıf uyguladığında VenomousPredator, her iki yöntemi de aynı anda uygulayacaktır.

Örnekler

Bazı yaygın Java arayüzleri şunlardır:

  • ComparablecompareToiki nesneyi eşit olarak tanımlamak veya birinin diğerinden daha büyük olduğunu belirtmek için kullanılan yönteme sahiptir . Jenerikler , uygulama sınıflarının hangi sınıf örneklerinin kendileriyle karşılaştırılabileceğini belirtmesine izin verir.
  • Serializableyöntemi veya alanı olmayan bir işaretleyici arabirimidir - boş bir gövdesi vardır. Bir sınıfın seri hale getirilebileceğini belirtmek için kullanılır . Onun Javadoc şey programlı yürütülmesine rağmen o, nasıl işlemesi gerektiği anlatılmaktadır

Ayrıca bakınız

Referanslar

Dış bağlantılar