Java-da interfeys


JavaBaxılıb 36

Java-da interfeys

Java interfeysi, tam abstraksiya əldə etməyimizə imkan verən bir açar sözdür. Bir interfeys bizə necə olduğunu deyil, nə etdiyini izah edir. Bu o deməkdir ki, bir interfeys yalnız funksiya elanını ehtiva edir və funksiya tətbiqini ehtiva etmir. İnterfeysi tətbiq edən sinif funksiya tərifini ehtiva edir.

Java-da interfeys xüsusiyyətləri

  • Tam abstraksiya təmin edir
  • Yalnız funksiya bildirişini ehtiva edir
  • Siniflərə bənzəyir, ancaq bir obyekt qura bilməz və ya instansiya dəyişənləri yoxdur
  • Bütün dəyişənlər varsayılan olaraq ümumi, statik və sondur
  • Bütün metodlar ümumi və ümumi olaraq mücərrəddir
  • Bir interfeys istifadə edərək birdən çox mirasın həyata keçirilməsinə imkan verir
  • Bir sinif birdən çox interfeys tətbiq edə bilər
  • Bir interfeys başqa bir interfeysi genişləndirə bilər
  • Tətbiq sinfi interfeysin bütün metodlarını tətbiq etməlidir.
  • Bəyanat zamanı bütün interfeys dəyişkənlərini işə salmalıyıq, əks halda tərtib xətası ilə nəticələnəcəkdir.
  • Daha çox təhlükəsizlik təmin edir.

İnterfeys istifadəsi

İnterfeysi müəyyənləşdirməyin əsas məqsədi interfeysi həyata keçirən hər hansı bir sinifin funksionallığı təmin etmək üçün öz seçiminə sahib olmasıdır. Bu o deməkdir ki, interfeysi tətbiq edən hər bir sinif tələbə əsasən eyni metod üçün fərqli funksiyalar təmin edə bilər.

İnterfeys elan etmək

Aşağıda bir interfeys elanının sintaksisidir.

access interface name {
  type final variable_name;
  returntype method_name(parameter);
}

//Example
public interface Account {
  public void accountdetails();
        public static final int accountnumber;
}

keçid - biz də istifadə edə bilərik ictimai or default giriş növündən bəhs etmiriksə. Siz müraciət edə bilərsiniz java giriş dəyişdiriciləri bu barədə daha çox bilmək.

ad - interfeys adı

dəyişən_ad - ismarıc olaraq dəyişən ictimai, statikyekun açıqca qeyd etməsək də. Çünki yekun, tətbiq sinifindəki dəyəri dəyişdirə bilmərik.

metod_adı - metod içərisində boş bir cism (kod yoxdur) olan metod adı. Bu mücərrədictimai qeyd etməsək də, default olaraq.

İnterfeys tətbiq olunur

Artıq bir interfeys elan etməyi öyrəndik, sonra interfeysi həyata keçirən bir sinif yaratmalıyıq. Bu o deməkdir ki, sinif interfeysdə elan edilmiş metodun funksionallığını və ya tətbiqini təmin etməlidir. Bunun üçün tətbiq edir sinif müəyyən edərkən açar söz. Birdən çox sinif eyni interfeysi tətbiq edə bilər.

Sinif içərisində interfeysə aid olan metodun funksionallığını təmin etməliyik. Sinif üçün interfeys daxilindəki bütün metodları tətbiq etmək məcburidir. Sinifə xas digər metodları da ehtiva edə bilər.

access_type class class_name implements interface_name {
       //provide implementation of the interface method
       returntype method_name(parameter) {
            //code
       }
}

//Example
public class Customer implements Account {
  public void accountdetails() {
    System.out.println("Account details");
  }
}

İndi bir interfeys və onun tətbiqi tərifinin sadə bir nümunəsini görək.

Java interfeysi nümunəsi

Bu adlı bir interfeysin sadə bir nümunəsidir Şekiller bir metod ehtiva edir hesabla ərazi. Heç bir tətbiqi olmayan boş bir üsuldur. Daha sonra adlı bir sinif yaradırıq kvadrat həyata keçirir Şekiller interfeys. Bu sinif metodun funksionallığını ehtiva edir hesabla ərazi kvadratın sahəsini hesablayır.

Hər bir forma sahəni hesablamaq üçün fərqli bir funksiyaya malik olduğundan, Şekilləri metodla bir interfeys olaraq elan etdik.

//Interface
interface Shapes {
  public void calculateArea();
}

//Class that implements the interface
class Square implements Shapes {

  int length;
  int area;
  
  Square(int l) {
    this.length = l;
  }
  @Override
  public void calculateArea() {
    area = length * length;
    System.out.println("Area of square is: " + area);
    
  }
}

//Main class
public class MainClass {

  public static void main(String[] args) {
    Square s = new Square(4);
    s.calculateArea();

  }

}
Area of square is: 16

İndi birdən çox sinifin eyni interfeysi necə tətbiq edə biləcəyini görə bilərik. Beləliklə, başqa bir sinif yaradırıq Düzbucaq həyata keçirir Şekiller interfeysi və üçün kodu ehtiva edir Bölgəni hesablayın düzbucaqlının sahəsini hesablamaq metodu.

//Interface
interface Shapes {
  public void calculateArea();
}

//Class that implements the interface
class Square implements Shapes {

  int length;
  int area;
  
  Square(int l) {
    this.length = l;
  }
  @Override
  public void calculateArea() {
    area = length * length;
    System.out.println("Area of square is: " + area);
    
  }
}

class Rectangle implements Shapes {
  int length;
  int breadth;
  int area;
  
  Rectangle(int l, int b) {
    this.length = l;
    this.breadth = b;
  }

  @Override
  public void calculateArea() {
    area = length * breadth;
    System.out.println("Area of rectangle is: " + area);
    
  }
  
}

//Main class
public class MainClass {

  public static void main(String[] args) {
    Square s = new Square(4);
    Rectangle r = new Rectangle(4,5);
    s.calculateArea();
    r.calculateArea();

  }

}
Area of square is: 16
Area of rectangle is: 20

İndi interfeyslər və onun tətbiqi barədə bir fikrimiz var, gəlin bir interfeysi necə genişləndirəcəyik. Bunun üçün əsas bir fikriniz olmalıdır javada miras

İnterfeysi genişləndirmək

Bir sinifin mirası tətbiq etmək üçün başqa bir sinfi necə genişləndirə biləcəyi kimi, bir interfeys də açar sözdən istifadə edərək başqa bir interfeysi genişləndirə bilər uzanır. Bu sinifdə, uşaq interfeysini tətbiq edən sinif, uşaqdakı və ana interfeyslərindəki bütün metodlar üçün funksionallığı təmin etməlidir.

Aşağıdakı bir nümunə ilə aydın şəkildə başa düşə biləcəksiniz.

Bank və Hesab 2 interfeys təyin etdik. The Bank interfeys bir simli dəyişənə və bir metoda malikdir. The hesab interfeysin bir metodu var. Bu interfeys Bank interfeysini genişləndirir, yəni Bank interfeysi metodlarını və dəyişənləri miras alması deməkdir.

İndi bir Müştəri həyata keçirən sinif hesab interfeys. Hesab interfeysi Bank interfeysini genişləndirdiyindən Müştəri sinfi hər iki interfeysin bütün metodlarını tətbiq etməlidir. Əks təqdirdə bir tərtib xətası ilə nəticələnəcəkdir. Bank interfeysindəki dəyişən borcludur yekun, yəni tətbiq sinfində dəyərini dəyişdirə bilməyəcəyimiz deməkdir.

interface Bank {
  String ifsccode = "HDFC00004680";
  public void displayCustomerDetails();
}

interface Account extends Bank{
  public void displayAccountDetails();
}

class Customer implements Account {
  
  String customername;
  int accountnumber;
  Customer(String name, int no) {
    this.customername = name;
    this.accountnumber = no;
  }

  @Override
  public void displayCustomerDetails() {
    System.out.println("Customer Details");
    System.out.println("Customer Name: " + customername);
    
  }

  @Override
  public void displayAccountDetails() {
    System.out.println("Account Details");
    System.out.println("IFSC Code: " + ifsccode);
    System.out.println("Account number: " + accountnumber);
  }
  
}
public class MultipleInterface {

  public static void main(String[] args) {
    Customer c = new Customer("Raju", 456712345);
    c.displayCustomerDetails();
    c.displayAccountDetails();

  }

}
Customer Details
Customer Name: Raju
Account Details
IFSC Code: HDFC00004680
Account number: 456712345

Birdən çox irsi həyata keçirmək

Java çoxsaylı miras anlayışını dəstəkləmir, yəni çoxsaylı siniflərin xüsusiyyətləri və metodlarını miras almaq deməkdir. Bunun səbəbi birdən çox sinif eyni metod adına sahib olduqda ortaya çıxan qeyri-müəyyənlikdir. Ancaq heç bir qeyri-müəyyənlik göstərməyən Java interfeysi istifadə edərək çoxlu miras tətbiq edə bilərik. Bunun səbəbi, interfeysi tətbiq edən sinif metod funksiyasını təmin edir. Birdən çox interfeys tətbiq etmək üçün sinif tərifində vergüllə ayrılmış interfeys adlarını təyin etməliyik.

misal

2 ayrı interfeysimiz var Hesab, Depozit. Hər iki interfeysdə hər biri 2 metod olduğu 1 metod var çap məlumatları hər iki interfeys üçün ortaqdır. İndi bir sinif yaradırıq Müştəri hər iki interfeysi həyata keçirir. Bu sinif hər iki interfeysdə müəyyən edilmiş bütün metodların funksionallığını təmin etməlidir. 1 metod ümumi olduğu üçün yalnız 1 tətbiq tələb olunur.

interface Account {
  public void accountdetails();
  public void printdetails();
}
interface Deposit {
  public void depositdetails();
  public void printdetails();
}
public class Customer implements Account,Deposit {
  public void accountdetails() {
    System.out.println("Account details");
  }
  public void depositdetails() {
    System.out.println("Deposit Details");
  }

  public void printdetails() {
    System.out.println("Printing");
  }
  public static void main(String[] args) {
    Customer c = new Customer();
    c.accountdetails();
    c.depositdetails();
    c.printdetails();
  }

}
Account details
Deposit Details
Printing

Diqqəti çəkən bir vacib məqam var. Bir sinif eyni metod adına, lakin fərqli qayıdış növlərinə malik olan bir metodu tətbiq edə bilməz. Bu vəziyyətdə, bir tərtib səhvi ilə nəticələnəcəkdir.

interface A {
  public String display();
}

interface B {
  public void display();
}

class Sample implements A, B {

  public String display() { //This will show error
        
  }
  
  public void display() { //This will show error
    
  }
  
}

İnterfeysdə standart metod

Ümumiyyətlə interfeys daxilindəki metodlar ümumi və mücərrəddir. Java 8-dən, standart bir üsulun dekallarını da çıxara bilərik. Bunun əsas istifadəsi, fərziyyəyə yeni bir metod əlavə etmək istədiyimizi düşünsək, tətbiqini interfeys tətbiq edən bütün siniflərə daxil etməliyik. Bu çox çətin ola bilər. Buna görə Java 8 standart olaraq təqdim edildi metodika bunu birbaşa funksionallıqla yanaşı interfeysdə elan edə bilərik. Vərəsəyə bənzər bir sinif istinad obyektindən istifadə edərək, standart metodu əldə edə bilərik.

interface demo {
  public void show();
  default void display() {
    System.out.println("New method");
  }
}

public class DefaultDemo implements demo{

  @Override
  public void show() {
    System.out.println("Existing method");
  }
  
  public static void main(String[] args) {
    DefaultDemo d = new DefaultDemo();
    d.show();
    d.display();
  }

}
Existing method
New method

Java Interface-də dəyişən ad çakışmaları

İndi eyni dəyişən adın hər iki interfeysə sahib olduğu bir nümunəni nəzərdən keçirin. Bu halda, bu dəyişənlərə tətbiqetmə sinifindən aşağıdakı kimi interfeys referansı vasitəsilə daxil ola bilərik. İnterfeysə daxil olmaq üçün A.name, B interfeys dəyişən üçün B.name istifadə edirik. Yalnız dəyişən ada daxil olduğumuzda bu, qeyri-müəyyənliyi həll edir. Beləliklə, dəyişən addan heç bir interfeys referansı olmadan istifadə etdiyimiz zaman səhv olur.

interface A {
  String name = "Interface A";
}

interface B {
  String name = "Interface B";
}

class Sample implements A, B {
  public void display() {
    //System.out.println(name); //error
    System.out.println(A.name);
    System.out.println(B.name);
    
  }
  
}
public class MultipleInheritance {

  public static void main(String[] args) {
    Sample s = new Sample();
    s.display();

  }

}
Interface A
Interface B

Etiket və ya Marker İnterfeysi

Boş bir interfeys təyin etdikdə, ona etiket və ya marker interfeysi deyirik. Bu tip java interfeysinin heç bir xassəsi və ya metodu yoxdur. Java-da mövcud olan az sayda interfeys EventListener, Serializable, Remote (java.rmi.Remote). Etiket interfeysinin əsas istifadəsi odur ki, sinif belə bir interfeysi tətbiq etdikdə, həmin interfeysin üzvlüyündən istifadə edə bilər. Bu JVM (Java Virtual Machine) bu interfeysi dəstəkləmək üçün xüsusi bir əməliyyat həyata keçirir. Məsələn, serializasiya və ya deserializasiya prosesi.

Bir etiket interfeysi aşağıdakılara bənzəyir. Bu java interfeysi əsasən JVM üçün istifadə olunur.

package java.uti;
public interface EventListener 
{ }

Yerləşmiş interfeys

Başqa bir interfeys daxilində bir interfeys yaratdığımızda, iç içə bir interfeys və ya daxili interfeys. Ən yaxşı nümunələrdən biri giriş interfeys. Bu içəridə müəyyən edilir xəritə interfeys. Buna görə istifadə edərək əldə edirik Xəritə Giriş və birbaşa Giriş interfeysinə daxil ola bilmir.

Yerləşmiş interfeysin əsas istifadəsi qruplaşdırılmış interfeys daxilində yalnız müəyyən bir interfeysi tətbiq etməyə imkan verir. Hər zaman daxili interfeysə yalnız xarici interfeysdən istifadə etməklə daxil ola bilərik. Varsayılan olaraq, iç içə olan interfeyslər statik və ümumidır. Bununla birlikdə daxili interfeysin giriş tipini dəyişə bilərik.

İç içə bir interfeysi 2 fərqli şəkildə elan edə bilərik.

  • Başqa bir interfeys daxilində
  • Bir sinif daxilində.

İnterfeys daxilində daxili interfeys nümunəsi

Aşağıdakı nümunədə 2 interfeysimiz var XY üsullarla ekran () və çap (). Daxili Y interfeysini həyata keçirmək istəyiriksə, bunu da qeyd etməliyik XY sinif tərifində. Beləliklə Əsas sinif Y interfeys metodunu tətbiq edir çap, və Xarici sinif X interfeys metodunu həyata keçirir ekran.

interface X {
  public void display();
  interface Y {
    public void print();
  }
}

class Main implements X.Y {

  public void print() {
    System.out.println("Y interface Print method");
    
  }
}

class Outer implements X {

  @Override
  public void display() {
    System.out.println("X interface display method");
    
  }
}

public class NestedInterfaceDemo {

  public static void main(String[] args) {
    Main m = new Main();
    m.print();
    Outer o = new Outer();
    o.display();
  }

}
Y interface Print method
X interface display method

Bir sinif daxilində bir İnterfeys nümunəsi

Aşağıdakı nümunədə gördüyünüz kimi bir sinif daxilində bir interfeys də təyin edə bilərik. Bu halda tətbiq sinfi interfeysi DisplayInterface.sample kimi tətbiq etməlidir, yəni daxili interfeysə yalnız sinif adını istifadə edərək daxil ola bilərsiniz. Həm sinif, həm də interfeys eyni metoda sahib ola bilər, çünki fərqli siniflər tətbiq edirlər. Bu səbəbdən hər hansı bir qeyri-müəyyənlik olmayacaqdır.

class DisplayInterface {
  interface sample {
    public void show();
  }
  
  //class method
  public void show() {
    System.out.println("DisplayInterface Class show method");
  }
}

public class InnerInterfaceDemo implements DisplayInterface.sample {

  @Override
  //Interface method
  public void show() {
    System.out.println("Sample interface show method");
    
  }
  
  public static void main(String[] args) {
    InnerInterfaceDemo i = new InnerInterfaceDemo();
    i.show();
    DisplayInterface d = new DisplayInterface();
    d.show();
  }
}
Sample interface show method
DisplayInterface Class show method

arayış

Şərh yaz

Translate »