CodeGym /בלוג Java /Random-HE /ממשק ב-Java
John Squirrels
רָמָה
San Francisco

ממשק ב-Java

פורסם בקבוצה
כידוע, כל דבר בג'אווה מורכב מאובייקטים, ולאובייקטים יש מצב (שדות) והתנהגות (מוגדרים בשיטות). ההתנהגות של מחלקה היא מה שיכול לקשור אותה למחלקות אחרות. להתנהגות יכולות להיות מאפיינים שונים, ולפעמים זה יכול להיות נוח יותר להעביר אותה מחוץ לכיתה, במיוחד כשמדובר באינטראקציה עם העולם החיצון. בדיוק כמו שהשלט של הטלוויזיה נמצא מחוץ ל"קופסה" עצמה. השלט הרחוק הוא ממשק לאינטראקציה של המשתמש עם פונקציות הטלוויזיה. לדוגמה, אתה יכול לדמיין שיעור שמיישם מטוס או מסוק מופשט. אובייקטים משני המעמדות, כמו רוב הציפורים יכולים לעוף, וכולם עושים זאת אחרת. אולי כדאי להעביר את התכונה הזו לישות נפרדת, וכל ה"פליירים" הפוטנציאליים יעברו בירושה מהישות הזו? אם אתה כבר מכיר מחלקות מופשטות, אתה יכול פשוט ליצור מחלקה מופשטת שניתן לעוף ו"לרשת" ממנה כיתות Copter ו-Plane. עם זאת, מה אם יש כמה נכסים כאלה? לדוגמה, מטוסים ומסוקים יכולים לטוס, אבל גם לנסוע על הקרקע. גם אם ניצור את מחלקת ה-Ride, לא נוכל עוד להקצות לו Copter ו-Plane. אחרי הכל, לכל מחלקה ג'אווה יש רק מחלקת אב אחת. ממשק ב-Java - 1שימוש בממשקים בשפת Java פותר חלקית בעיה זו. ממשקים ב-Java מגדירים פונקציונליות כלשהי שאין לה מימוש ספציפי, אשר מיושמת לאחר מכן על ידי מחלקות המשתמשות בממשקים אלה. ומחלקה אחת יכולה ליישם ממשקים רבים. למעשה, על ידי הטמעת ממשק ב-Java, אנו מצהירים שהכיתה שלנו יכולה לעשות משהו, אנו מדווחים על ההתנהגות שלה. אנחנו כבר מבצעים את היישום הקונקרטי של ההתנהגות בכיתה. כך. מטוס ומסוק ממריאים בצורה שונה: מטוס צריך מסלול, בעוד שמסוק בדרך כלל ממריא אנכית. פרטים כאלה מיושמים בצורה הטובה ביותר בתוך הכיתה.

ממשקים ב-Java

כדי להגדיר ממשק בשפת Java, משתמשים במילת המפתח של הממשק. לדוגמה:
interface Voice {

    void talk();
}
הממשק שלמעלה נקרא Voice . ממשק ב-Java עשוי להגדיר קבועים ושיטות, שעשויות להיות להן יישומים או לא. בדרך כלל, לשיטות ממשק אין מימוש, בדיוק כמו בדוגמה זו. שיטות בממשקים ללא יישום הן כמו שיטות מופשטות של מחלקות מופשטות. בדרך כלל אין לשיטות ממשק משנה גישה. עם זאת, הגישה היא למעשה ציבורית כברירת מחדל מכיוון שמטרת הממשק היא להגדיר פונקציונליות עבור מימוש מחלקה. לכן, כל הפונקציונליות צריכה להיות פתוחה ליישום. כדי ליישם ממשק, השתמש במילת המפתח Implements בזמן הצהרת הכיתה שלך. יתרה מכך, אם ממשק מכיל שיטה ללא מימוש, אזי יש ליישם את השיטה הזו במחלקה המיישמת.
public class Duck implements Voice {


@Override
public void voice() {
   System.out.println("Quack");
}


    }

דוגמה לקוד ממשק

ניקח דוגמה מלאה יותר. לכל חיה (טוב, כמעט לכל) יש את היכולת להשמיע קולות. בואו ניצור קול ממשק Java למקרה זה. יש לו שיטת talk() ללא יישום.
public interface Voice {
   void talk();
}
כעת לכל המחלקות התומכות בממשק Voice חייבות להיות יישום של שיטת talk() . בואו ניצור שני מחלקות - חתול וכלב ונציין שהם מיישמים את ממשק הקול . במקרה זה, אם לא תטמיע בו מחלקה, התוכנית לא תעבוד. יישום שיטות פשוט מאוד. כאשר קוראים לשיטת talk() של אובייקט ממחלקת Cat , המקבילה לטקסט של מיאו תוצג על המסך, במקרה של המחלקה Dog , נביחות. כמו כן נוסיף לשיעורים גטרים, קובעים ובנאי.
public class Cat implements Voice {
   String name;
   String breed;
   int year;

   public Cat(String name, String breed, int year) {
       this.name = name;
       this.breed = breed;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getBreed() {
       return breed;
   }

   public void setBreed(String breed) {
       this.breed = breed;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("meow...");
   }
}
public class Dog implements Voice {
   String name;
   String color;
   int year;

   public Dog(String name, String color, int year) {
       this.name = name;
       this.color = color;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("WOF WOF");
   }
}
למעשה, יישומי השיעורים והשיטות שלנו דומים מאוד. בואו ניצור כיתה נוספת, Parrot , עם תמיכה בקול . רק שיטת talk() תעבוד בה אחרת: המשתמש יזין מחרוזת לקונסולה, והתוכי "יחזור" עליה באמצעות שיטת talk() .
import java.util.Scanner;

public class Parrot implements Voice {
   String name;
   String color;
   int year;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       Scanner scanner = new Scanner(System.in);
       System.out.println("WHat should I repeat after you?...");
       String s =  scanner.nextLine();
       System.out.println(s);
   }
}
כעת בוא ניצור מחלקת מבחן ונראה איזו תוצאה תפיק התוכנית אם נקרא לשיטת talk() של האובייקטים של מחלקות החתול , הכלב והתוכי בתורו.
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Parrot parrot = new Parrot();
       parrot.talk();
   }
}
הפלט נמצא למטה. טקסט ירוק הוא זה שהמשתמש הודפס במסוף.
מיאו... WOF WOF מה אני צריך לחזור אחריך?... אני ציפור מאוד דברנית וחכמה אני מאוד מדברת וציפור חכמה

שיטות ברירת מחדל

לפני הוצאת JDK 8 בעת הטמעת ממשק ב-Java, היינו צריכים ליישם את כל השיטות שלו במחלקה. יחד עם זאת, ממשק Java עצמו יכול להכיל רק הגדרות שיטה ללא יישום ספציפי. JDK 8 מוסיף פונקציונליות חדשה - שיטות ברירת מחדל. כעת לממשקי Java יכולים להיות לא רק הגדרות שיטה אלא גם יישומי ברירת מחדל. הם משמשים אם המחלקה מיישמת את הממשק אך לא מיישמת את השיטה. לדוגמה, בואו נשנה את שיטת talk() בממשק Voice לשיטת ברירת המחדל. כמו כן, נכתוב מחלקה חדשה המותאמת ל-Voice Duck שאין בה יישום של שיטת הדיבור .
public interface Voice {
   default void talk() {
       System.out.println("I can talk...");
   }
}
public class Duck implements Voice {

   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

   public void fly(){
       System.out.println("I am flying!!!");
   }

}
עכשיו בואו נשנה קצת את שיעור המבחן שלנו.
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Duck duck = new Duck();
       duck.talk();
   }
}
הפלט נמצא כאן:
מיאו... WOF WOF אני יכול לדבר...
לִרְאוֹת? באובייקטים של מחלקות Dog ו- Cat , השיטה overridden talk() נקראת, אבל באובייקט של המחלקה Duck , שיטת ברירת המחדל מ-interface נקראת. לפיכך, שיטת ברירת המחדל היא רק שיטה ללא שינויים ומסומנת עם מילת המפתח המוגדרת כברירת מחדל. אנחנו לא צריכים ליישם את שיטת ברירת המחדל במחלקה המיישמת את הממשק, אבל אנחנו יכולים לעקוף אותה.

שיטות סטטיות

מכיוון ששיטות סטטיות של JDK 8 זמינות בממשקי Java - הן דומות לשיטות מחלקות:
interface Voice {

    void talk();

    static void check(){

        System.out.println("checked...");
    }
}
כדי להתייחס לשיטה סטטית של ממשק, בדיוק כמו במקרה של מחלקות, כתוב את שם הממשק ואת השיטה:
public static void main(String[] args) {

    Voice.check();
}

הטמעה מרובה של ממשקים

אם אנחנו צריכים ליישם כמה ממשקים במחלקת Java, אז כולם רשומים בפסיק אחרי המילה מיישמת :
public class Duck implements Swimmable, Flyable, Voice {

    public void moveForward() {
        System.out.println(" Quack, I am moving forward...");
    }

    public void TurnRight(){
        System.out.println("I am turning right...");
    }
    public void TurnLeft(){
        System.out.println("I am turning left...");

    }

    public void Stop() {
        System.out.println("Quack. I am relaxing on the surface of the water...");
    }

    public void fly(){
        System.out.println("I am flying!!!");
    }

}
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION