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, interface
Dil 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.
abstract
Soyut 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 public
ve 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.
implements
Bir 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. extends
Anahtar 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 .
BuradagetArea()
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 default
anahtar 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()
,.