CodeGym /จาวาบล็อก /สุ่ม /อินเทอร์เฟซในจาวา
John Squirrels
ระดับ
San Francisco

อินเทอร์เฟซในจาวา

เผยแพร่ในกลุ่ม
อย่างที่คุณทราบ ทุกอย่างใน Java ประกอบด้วยอ็อบเจ็กต์ และอ็อบเจ็กต์มีสถานะ (ฟิลด์) และพฤติกรรม (กำหนดโดยวิธีการ) พฤติกรรมของคลาสคือสิ่งที่สามารถผูกมัดคลาสนั้นกับคลาสอื่นได้ พฤติกรรมอาจมีลักษณะเฉพาะที่แตกต่างกัน และบางครั้งอาจสะดวกกว่าหากย้ายออกไปนอกชั้นเรียน โดยเฉพาะอย่างยิ่งเมื่อต้องมีปฏิสัมพันธ์กับโลกภายนอก เช่นเดียวกับรีโมทคอนโทรลของทีวีที่อยู่นอก "กล่อง" นั่นเอง รีโมทคอนโทรลเป็นอินเทอร์เฟซสำหรับการโต้ตอบของผู้ใช้กับฟังก์ชันทีวี ตัวอย่างเช่น คุณสามารถจินตนาการถึงชั้นเรียนที่ใช้เครื่องบินหรือเฮลิคอปเตอร์เชิงนามธรรม วัตถุของทั้งสองประเภท เช่น นกส่วนใหญ่บินได้ และพวกมันต่างก็ทำต่างกัน บางทีอาจคุ้มค่าที่จะย้ายฟีเจอร์นี้ไปยังเอนทิตีที่แยกจากกัน และ "ใบปลิว" ที่เป็นไปได้ทั้งหมดจะได้รับการสืบทอดจากเอนทิตีนี้ หากคุณคุ้นเคยกับคลาสนามธรรมอยู่แล้ว คุณสามารถสร้างคลาสนามธรรม Flyable และ "สืบทอด" คลาส Copter และ Plane จากคลาสนั้นได้ อย่างไรก็ตาม จะเกิดอะไรขึ้นหากมีคุณสมบัติดังกล่าวหลายประการ? ตัวอย่างเช่น เครื่องบินและเฮลิคอปเตอร์สามารถบินได้ แต่ก็เดินทางบนพื้นดินได้เช่นกัน แม้ว่าเราจะสร้างคลาส Ride เราก็ไม่สามารถกำหนด Copter และ Plane ให้กับมันได้อีกต่อไป ท้ายที่สุดแล้ว แต่ละคลาส Java จะมีคลาสพาเรนต์เพียงคลาสเดียวเท่านั้น อินเทอร์เฟซใน Java - 1การใช้อินเทอร์เฟซในภาษา Java ช่วยแก้ปัญหานี้ได้บางส่วน อินเทอร์เฟซใน Java กำหนดฟังก์ชันการทำงานบางอย่างที่ไม่มีการใช้งานเฉพาะ ซึ่งจะถูกนำไปใช้โดยคลาสที่ใช้อินเทอร์เฟซเหล่านี้ และคลาสหนึ่งสามารถใช้อินเทอร์เฟซได้มากมาย ในความเป็นจริง ด้วยการใช้อินเทอร์เฟซใน Java เราประกาศว่าคลาสของเราสามารถทำบางสิ่งบางอย่างได้ และเราจะรายงานพฤติกรรมของมัน เราได้ดำเนินการนำพฤติกรรมดังกล่าวไปปฏิบัติอย่างเป็นรูปธรรมในชั้นเรียนแล้ว ดังนั้น. เครื่องบินและเฮลิคอปเตอร์บินขึ้นต่างกัน: เครื่องบินจำเป็นต้องมีรันเวย์ ในขณะที่เฮลิคอปเตอร์มักจะบินขึ้นในแนวตั้ง รายละเอียดดังกล่าวควรนำไปใช้ภายในชั้นเรียนได้ดีที่สุด

อินเทอร์เฟซใน Java

ในการกำหนดอินเทอร์เฟซในภาษา Java จะใช้คีย์เวิร์ดอินเทอร์เฟซ ตัวอย่างเช่น:
interface Voice {

    void talk();
}
อินเทอร์เฟซ ด้าน บนเรียกว่าเสียง อินเทอร์เฟซใน Java อาจกำหนดค่าคงที่และวิธีการซึ่งอาจมีหรือไม่มีการใช้งานก็ได้ โดยปกติแล้ว วิธีการอินเทอร์เฟซจะไม่มีการใช้งาน เหมือนกับในตัวอย่างนี้ วิธีการในอินเทอร์เฟซที่ไม่มีการใช้งานก็เหมือนกับวิธีนามธรรมของคลาสนามธรรม วิธีการอินเทอร์เฟซมักจะไม่มีตัวดัดแปลงการเข้าถึง อย่างไรก็ตาม จริงๆ แล้วการเข้าถึงเป็นแบบสาธารณะตามค่าเริ่มต้น เนื่องจากจุดประสงค์ของอินเทอร์เฟซคือเพื่อกำหนดฟังก์ชันการทำงานสำหรับการนำคลาสไปใช้ ดังนั้นควรเปิดฟังก์ชันการทำงานทั้งหมดเพื่อนำไปใช้งาน หากต้องการใช้อินเทอร์เฟซ ให้ใช้ คีย์เวิร์ด Implementsในขณะที่ประกาศชั้นเรียนของคุณ นอกจากนี้ หากอินเทอร์เฟซมีวิธีการที่ไม่มีการใช้งาน วิธีการนั้นจะต้องถูกนำไปใช้ในคลาสการใช้งาน
public class Duck implements Voice {


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


    }

ตัวอย่างโค้ดอินเทอร์เฟซ

ลองใช้ตัวอย่างที่สมบูรณ์ยิ่งขึ้น สัตว์ทุกตัว (หรือเกือบทุกชนิด) มีความสามารถในการส่งเสียงได้ มาสร้างอินเทอร์เฟซ Java Voiceสำหรับกรณีนี้กัน มันมี เมธอด talk()ที่ไม่มีการใช้งาน
public interface Voice {
   void talk();
}
ตอนนี้คลาสทั้งหมดที่รองรับ อินเทอร์เฟ ซเสียงจะต้องมีการใช้งานเมธอดtalk () มาสร้างคลาสสองคลาส — CatและDogและระบุว่าคลาสเหล่านี้ใช้อินเทอร์เฟซเสียง ในกรณีนี้ถ้าคุณไม่ใช้คลาสในนั้น โปรแกรมจะไม่ทำงาน วิธีการปฏิบัตินั้นง่ายมาก เมื่อเรียกเมธอดtalk()ของอ็อบเจ็กต์ของ คลาส Catข้อความที่เทียบเท่ากับแมวจะปรากฏบนหน้าจอ ในกรณีของ คลาส Dogนั่นก็คือเสียงเห่า นอกจากนี้เรายังจะเพิ่ม getters, setters และ Constructor ให้กับคลาสด้วย
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ที่รองรับVoice กันดีกว่า เฉพาะ วิธี 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()ของอ็อบเจ็กต์ของ คลาส Cat , DogและParrotตามลำดับ
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เป็นวิธีเริ่มต้น นอกจากนี้เรายังจะเขียน คลาส Duckที่เปิดใช้งานVoice ใหม่ ซึ่งไม่มีการนำวิธี การพูดคุย ไปใช้
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วิธีการแทนที่talk()จะถูกเรียก แต่ในอ็อบเจ็กต์ของ คลาส Duckนั้นจะมีการเรียกเมธอดเริ่มต้นจากอินเทอร์เฟซ ดังนั้นวิธีการเริ่มต้นจึงเป็นเพียงวิธีการที่ไม่มีตัวแก้ไขและถูกทำเครื่องหมายด้วยคำหลักเริ่มต้น เราไม่จำเป็นต้องใช้วิธีการเริ่มต้นในคลาสที่ใช้อินเทอร์เฟซ แต่เราสามารถแทนที่มันได้

วิธีการแบบคงที่

เนื่องจากวิธีการคงที่ของ JDK 8 มีอยู่ในอินเทอร์เฟซ Java จึงคล้ายกับวิธีการเรียน:
interface Voice {

    void talk();

    static void check(){

        System.out.println("checked...");
    }
}
หากต้องการอ้างถึงวิธีการแบบสแตติกของอินเทอร์เฟซ เช่นเดียวกับในกรณีของคลาส ให้เขียนชื่อของอินเทอร์เฟซและวิธีการ:
public static void main(String[] args) {

    Voice.check();
}

การใช้งานอินเทอร์เฟซหลายรายการ

หากเราจำเป็นต้องใช้หลายอินเทอร์เฟซในคลาส Java อินเทอร์เฟซเหล่านั้นทั้งหมดจะถูกแสดงด้วยเครื่องหมายจุลภาคหลังคำว่าApplys :
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