Java Arayüzü (Örneklerle)

Bu eğitimde Java arayüzleri hakkında bilgi edineceğiz. Arayüzlerin nasıl uygulanacağını ve ne zaman kullanılacağını örnekler yardımıyla detaylı olarak öğreneceğiz.

Arayüz, gövdesi olmayan bir grup yöntem içeren tamamen soyut bir sınıftır.

Java'da bir arabirim, diğer sınıfların uygulaması gereken bir dizi belirtimi tanımlar. Örneğin,

 interface Language ( public void getName(); )

Burada, interfaceDil adlı bir arayüz oluşturmak için anahtar kelimeyi kullandık . Dil arabirimi bir belirtimi tanımlar getName().

Şimdi, bu arayüzü kullanan her sınıf, getName()spesifikasyonu uygulamalıdır .

Örnek: Java Arayüzü

 // create an interface interface Language ( void getName(String name); ) // class implements interface class ProgrammingLanguage implements Language ( // implementation of abstract method public void getName(String name) ( System.out.println("Programming Language: " + name); ) ) class Main ( public static void main(String() args) ( ProgrammingLanguage language = new ProgrammingLanguage(); language.getName("Java"); ) )

Çıktı

 Programlama Dili: Java

Yukarıdaki örnekte, Dil adında bir arayüz oluşturduk. Arayüz soyut bir yöntem içerir getName().

Burada, ProgrammingLanguage sınıfı arabirimi uygular ve yöntemin uygulanmasını sağlar.

abstractSoyut yöntemler bir arayüz içerisinde bildirilirken anahtar kelime kullanılması zorunlu değildir . Bunun nedeni, bir arayüzün normal yöntemleri değil yalnızca soyut yöntemleri içermesidir.

Not : Bir arabirim içindeki tüm yöntemler örtüktür publicve tüm alanlar örtüktür public static final. Örneğin,

 interface Language ( // by default public static final String type = "programming language"; // by default public void getName(); )

Bir Arayüz Uygulama

Soyut sınıflar gibi, bir arayüzün nesnelerini yaratamayız. Ancak bir arayüz uygulayabiliriz.

implementsBir arayüzü uygulamak için anahtar kelimeyi kullanırız. Örneğin,

 // create an interface interface Polygon ( void getArea(int length, int breadth); ) // implement the Polygon interface class Rectangle implements Polygon ( // implementation of abstract method public void getArea(int length, int breadth) ( System.out.println("The area of the rectangle is " + (length * breadth)); ) ) class Main ( public static void main(String() args) ( // create an object Rectangle r1 = new Rectangle(); r1.getArea(5, 6); ) )

Çıktı

 Dikdörtgenin alanı 30'dur

Yukarıdaki örnekte Polygon adında bir arayüz oluşturduk. Arayüz soyut bir yöntem içerir getArea().

Burada, Rectangle sınıfı Polygon'u uygular. Ve getArea()yöntemin uygulanmasını sağlar .

Not : Bir sınıf birden çok arabirim uygulayabilir. Örneğin,

 interface A ( // members of A ) interface B ( // members of B ) class C implements A, B ( // abstract members of A // abstract members of B )

Bir Arayüzün Genişletilmesi

Sınıflara benzer şekilde, arayüzler diğer arayüzleri genişletebilir. extendsAnahtar kelime arayüzleri uzatılması için kullanılır. Örneğin,

 interface Line ( // members of Line interface ) // extending interface interface Polygon extends Line ( // members of Polygon interface // members of Line interface )

Burada Polygon arayüzü, Line arayüzünü genişletir. Şimdi, herhangi bir sınıf Polygon'u uygularsa, hem Line hem de Polygon'un tüm soyut yöntemleri için uygulamalar sağlamalıdır.

Not : Bir arabirim birden çok arabirimi genişletebilir. Örneğin,

 interface A (… ) interface B (… ) interface C extends A, B (… )

Java'da Arayüzün Avantajları

Artık arayüzlerin ne olduğunu bildiğimize göre, Java'da arayüzlerin neden kullanıldığını öğrenelim.

  • Arabirimler özelliklerini sağlar (bunu uygulayan) bir sınıf izleyin gerektiğini söyledi.
    Önceki örneğimizde, getArea()Polygon arayüzünde bir şartname olarak kullandık . Bu, her çokgenin alanını elde edebilmemiz için bir kural koymak gibidir.
    Artık Polygon arabirimini uygulayan herhangi bir sınıf, getArea()yöntem için bir uygulama sağlamalıdır .
  • Soyut sınıflara benzer şekilde, arayüzler Java'da soyutlamaya ulaşmamıza yardımcı olur .
    Burada getArea()poligonların alanını hesapladığını biliyoruz , ancak alanın hesaplanma şekli farklı çokgenler için farklıdır. Dolayısıyla uygulaması getArea()birbirinden bağımsızdır.
  • Arayüzler, Java'da çoklu kalıtım elde etmek için de kullanılır. Örneğin,
     interface Line (… ) interface Polygon (… ) class Rectangle implements Line, Polygon (… )

    Burada, Rectangle sınıfı iki farklı arayüz uyguluyor. Java'da çoklu mirası bu şekilde elde ederiz.

Java Arayüzlerinde varsayılan yöntemler

Java 8'in piyasaya sürülmesiyle, artık bir arabirim içinde uygulama içeren yöntemler ekleyebiliyoruz. Bu yöntemlere varsayılan yöntemler denir.

Arayüzlerde varsayılan yöntemleri bildirmek için defaultanahtar kelimeyi kullanırız . Örneğin,

 public default void getSides() ( // body of getSides() )

Neden varsayılan yöntemler?

Java'da neden varsayılan yöntemlerin tanıtıldığını anlamak için bir senaryo ele alalım.

Bir arayüze yeni bir yöntem eklememiz gerektiğini varsayalım.

Yöntemi uygulama yapmadan arayüzümüze kolayca ekleyebiliriz. Ancak bu hikayenin sonu değil. Bu arabirimi uygulayan tüm sınıflarımız, yöntem için bir uygulama sağlamalıdır.

Çok sayıda sınıf bu arayüzü uyguluyorsa, tüm bu sınıfları izlememiz ve bunlarda değişiklikler yapmamız gerekir. Bu sadece can sıkıcı değil, aynı zamanda hataya da açık.

Bunu çözmek için Java, varsayılan yöntemleri tanıttı. Varsayılan yöntemler, sıradan yöntemler gibi miras alınır.

Varsayılan yöntemleri daha iyi anlamak için bir örnek alalım.

Örnek: Java Arayüzünde Varsayılan Yöntem

 interface Polygon ( void getArea(); // default method default void getSides() ( System.out.println("I can get sides of a polygon."); ) ) // implements the interface class Rectangle implements Polygon ( public void getArea() ( int length = 6; int breadth = 5; int area = length * breadth; System.out.println("The area of the rectangle is " + area); ) // overrides the getSides() public void getSides() ( System.out.println("I have 4 sides."); ) ) // implements the interface class Square implements Polygon ( public void getArea() ( int length = 5; int area = length * length; System.out.println("The area of the square is " + area); ) ) class Main ( public static void main(String() args) ( // create an object of Rectangle Rectangle r1 = new Rectangle(); r1.getArea(); r1.getSides(); // create an object of Square Square s1 = new Square(); s1.getArea(); s1.getSides(); ) )

Çıktı

Dikdörtgenin alanı 30'dur 4 tarafım var. Karenin alanı 25'dir Bir çokgenin kenarlarını alabilirim.

In the above example, we have created an interface named Polygon. It has a default method getSides() and an abstract method getArea().

Here, we have created two classes Rectangle and Square that implement Polygon.

The Rectangle class provides the implementation of the getArea() method and overrides the getSides() method. However, the Square class only provides the implementation of the getArea() method.

Now, while calling the getSides() method using the Rectangle object, the overridden method is called. However, in the case of the Square object, the default method is called.

private and static Methods in Interface

The Java 8 also added another feature to include static methods inside an interface.

Similar to a class, we can access static methods of an interface using its references. For example,

 // create an interface interface Polygon ( staticMethod()(… ) ) // access static method Polygon.staticMethod();

Note: With the release of Java 9, private methods are also supported in interfaces.

We cannot create objects of an interface. Hence, private methods are used as helper methods that provide support to other methods in interfaces.

Practical Example of Interface

Let's see a more practical example of Java Interface.

 // To use the sqrt function import java.lang.Math; interface Polygon ( void getArea(); // calculate the perimeter of a Polygon default void getPerimeter(int… sides) ( int perimeter = 0; for (int side: sides) ( perimeter += side; ) System.out.println("Perimeter: " + perimeter); ) ) class Triangle implements Polygon ( private int a, b, c; private double s, area; // initializing sides of a triangle Triangle(int a, int b, int c) ( this.a = a; this.b = b; this.c = c; s = 0; ) // calculate the area of a triangle public void getArea() ( s = (double) (a + b + c)/2; area = Math.sqrt(s*(s-a)*(s-b)*(s-c)); System.out.println("Area: " + area); ) ) class Main ( public static void main(String() args) ( Triangle t1 = new Triangle(2, 3, 4); // calls the method of the Triangle class t1.getArea(); // calls the method of Polygon t1.getPerimeter(2, 3, 4); ) )

Output

 Area: 2.9047375096555625 Perimeter: 9

In the above program, we have created an interface named Polygon. It includes a default method getPerimeter() and an abstract method getArea().

We can calculate the perimeter of all polygons in the same manner so we implemented the body of getPerimeter() in Polygon.

Now, all polygons that implement Polygon can use getPerimeter() to calculate perimeter.

Bununla birlikte, alanı hesaplama kuralı, farklı çokgenler için farklıdır. Bu nedenle, getArea()uygulama olmadan dahil edilmiştir.

Polygon uygulayan herhangi bir sınıf getArea(),.

Ilginç makaleler...