Interface Java là gì
Một Interface trong Java là một bản thiết kế của một lớp. Nó chỉ có các phương thức trừu tượng. Interface là một kỹ thuật để thu được tình trừu tượng hoàn toàn và đa kế thừa trong Java. Interface trong Java cũng biễu diễn mối quan hệ IS-A. Nó không thể được khởi tạo giống như lớp trừu tượng. Show
Ghi chú: Java Compiler thêm từ khóa public và abstract trước phương thức của interface và các từ khóa public, static và final trước các thành viên dữ liệu. Nói cách khác, các trường của Interface là public, static và final theo mặc định và các phương thức là public và abstract. Một Interface trong Java là một tập hợp các phương thức trừu tượng (abstract). Một class triển khai một interface, do đó kế thừa các phương thức abstract của interface. Một interface không phải là một lớp. Viết một interface giống như viết một lớp, nhưng chúng có 2 định nghĩa khác nhau. Một lớp mô tả các thuộc tính và hành vi của một đối tượng. Một interface chứa các hành vi mà một class triển khai. Trừ khi một lớp triển khai interface là lớp trừu tượng abstract, còn lại tất cả các phương thức của interface cần được định nghĩa trong class. Một interface tương tự với một class bởi những điểm sau đây:
Mặc dù vây, một interface khác với một class ở một số điểm sau đây, bao gồm:
Ví dụ đơn giản về Interface trong JavaTrong ví dụ này, Printable Interface chỉ có một phương thức, trình triển khai của nó được cung cấp bởi lớp A. Khi ghi đè các phương thức được định nghĩa trong interface, có một số qui tắc sau:
Khi triển khai interface, có vài quy tắc sau:
Đa kế thừa trong Java bởi InterfaceNếu một lớp triển khai đa kế thừa, hoặc một Interface kế thừa từ nhiều Interface thì đó là đa kế thừa. interface Printable{ void print(); } interface Showable{ void show(); } class A7 implements Printable,Showable{ public void print(){System.out.println("Hello");} public void show(){System.out.println("Welcome");} public static void main(String args[]){ A7 obj = new A7(); obj.print(); obj.show(); } }Câu hỏi: Đa kế thừa không được hỗ trợ thông qua lớp trong Java nhưng là có thể bởi Interface, tại sao? Như đa thảo luận trong chương về tính kế thừa, đa kế thừa không được hỗ trợ thông qua lớp. Nhưng nó được hỗ trợ bởi Interface bởi vì không có tính lưỡng nghĩa khi trình triển khai được cung cấp bởi lớp Implementation. Ví dụ: interface Printable{ void print(); } interface Showable{ void print(); } class TestTnterface1 implements Printable,Showable{ public void print(){System.out.println("Hello");} public static void main(String args[]){ TestTnterface1 obj = new TestTnterface1(); obj.print(); } }Trong ví dụ trên, Printable và Showable interface có cùng các phương thức nhưng trình triển khai của nó được cung cấp bởi lớp TestInterface1, vì thế không có tính lưỡng nghĩa ở đây. Kế thừa Interface trong JavaMột lớp triển khai Interface nhưng một Interface kế thừa từ Interface khác. interface Printable{ void print(); } interface Showable extends Printable{ void show(); } class Testinterface2 implements Showable{ public void print(){System.out.println("Hello");} public void show(){System.out.println("Welcome");} public static void main(String args[]){ Testinterface2 obj = new Testinterface2(); obj.print(); obj.show(); } }Marker (hay Tagging) Interface trong Java là gì?Đó là một Interface mà không có thành viên nào. Ví dụ: Serializable, Cloneable, Remote, … Chúng được sử dụng để cung cấp một số thông tin thiết yếu tới JVM để mà JVM có thể thực hiện một số hoạt động hữu ích. //Cach Serializable interface duoc viet? public interface Serializable{ }Có hai mục đích thiết kế chủ yếu của tagging interface là: Tạo một cha chung: Như với EventListener interface, mà được kế thừa bởi hàng tá các interface khác trong Java API, bạn có thể sử dụng một tagging interface để tạo một cha chung cho một nhóm interface. Ví dụ, khi một interface kế thừa EventListener, thì JVM biết rằng interface cụ thể này đang được sử dụng trong một event. Thêm một kiểu dữ liệu tới một class: Đó là khái niệm tagging. Một class mà triển khai một tagging interface không cần định nghĩa bất kỳ phương thức nào, nhưng class trở thành một kiểu interface thông qua tính đa hình (polymorphism). Lồng Interface trong JavaGhi chú: Một Interface có thể có Interface khác, đó là lồng Interface. Chúng ta sẽ tìm hiểu chi tiết trong chương về Lồng các lớp trong Java. Ví dụ: interface printable{ void print(); interface MessagePrintable{ void msg(); } }Ps: Đi làm có thể hỏi về sự khác nhau giữa abstract class và interface. Các bạn nên chú ý các phương thức của interface là abstract 100%, trong abstract class có thể có phương thức không phải abstract. Trong thiết kế phần mềm, interface thường được dùng để chỉ 2 hay nhiều class cùng làm việc gì đó (ví dụ cùng in - Printable), trong khi abstract class thường hướng đến quan hệ cha con trong lập trình hướng đối tượng. Các bạn có thể đọc thêm https://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract-class-and-vice-versa
Một Interface trong Java là một bản kế hoạch của class. Nó có chứa static constant và abstract method (phương thức trừu tượng) Interface trong Java là một cơ chế để đạt được sự trừu tượng. Có thể chỉ có các phương thức trừu tượng trong Interface, không có phần thân phương thức. Nó được sử dụng để đạt được tính trừu tượng và đa kế thừa trong Java. Nói cách khác, interface có thể có các phương thức trừu tượng và biến. Không có thân phương thức.
Tại sao nên sử dụng interface trong JAVA?Chủ yếu có ba lý do để sử dụng giao diện. Chúng được đưa ra dưới đây.
Ghi chú: Loose coupling là có nghĩa là giữa các class gần như độc lập. Nếu class A biết về class B qua những gì đã thể hiện trong class B thì class A và class B là Loose coupling Cách khai báo Interface trong JAVAMột Interface trong Java được khai báo bằng cách sử dụng từ khóa interface. Nó cung cấp tổng thể trừu tượng; có nghĩa là tất cả các phương thức trong một interface được khai báo mà không có phần thân và tất cả các trường (field) là công khai (public), tĩnh (static) và cuối (final) cùng theo mặc định. Một class triển khai một interface phải thực hiện tất cả các phương thức được khai báo trong interface. Cú pháp của interface trong Java: interfaceTham khảo: Cách đặt tên trong Java để biết cách đặt tên Interface tiêu chuẩn. Cải tiến Interface trong JAVA 8Kể từ Java 8, Interface có thể có các phương thức default và static sẽ được thảo luận sau. Ghi chú: Trình biên dịch Java tự động thêm các từ khóa public và abstract trước phương thức trong Interface. Và nó cũng thêm các từ khóa public, static và final trước các data member. Do đó khi khai báo Interface chúng ta không cần thêm chúng. Ví dụ chúng ta khai báo một interface thế này: interface IInAn { int MIN = 5; void in(); }Thì trình biên dịch sẽ hiểu / dịch như thế này: interface IInAn { public static final int MIN = 5; public abstract void in(); }Mối quan hệ giữa class và interfaceNhư trong hình bên dưới, một class mở rộng (extend) một class khác, một interface mở rộng (extend) một interface khác, nhưng một class sẽ triển khai (implements) một interface. Lưu ý: Nếu bạn đang tích cực học Java để đi thực tập, đi làm. Hãy tham khảo ngay khóa học LẬP TRÌNH JAVA WEB tại NIIT – ICT Hà Nội để được hướng dẫn bởi chuyên gia doanh nghiệp, đào tạo theo nhu cầu thực tiễn, tuyển dụng ngay cuối khóa học! Ví dụ về Interface trong JAVATrong ví dụ này, Interface IInAn chỉ có một phương thức và việc triển khai nó được cung cấp trong class A6. // Khai báo Interface interface IInAn{ // Khai báo phương thức trừu tượng void inThongTin(); } // Triển khai interface class A6 implements IInAn{ // Viết khai triển cụ thể cho phương thức trừu tượng public void inThongTin(){ System.out.println("Xin Chào"); } public static void main(String args[]){ A6 a6 = new A6(); a6.inThongTin(); } }Kết quả khi chạy chương trình: Xin chàoTiếp tục một ví dụ khác về interface trong Java. Trong ví dụ này, Interface IVeHinh chỉ có một phương thức ve(). Việc triển khai nó được cung cấp bởi các lớp HinhChuNhat và HinhTron. Trong một kịch bản thực tế, một interface sẽ được định nghĩa bởi người khác, việc triển khai nó sẽ khác nhau bởi các lập trình viên khác nhau. Phần triển khai được ẩn bởi người dùng sử dụng interface. // Khai báo Interface: User đầu tiên interface IVeHinh{ void ve(); } // Triển khai: User thứ hai class HinhChuNhat implements IVeHinh{ public void ve(){ System.out.println("Vẽ hình chữ nhật..."); } } class HinhTron implements IVeHinh{ public void ve(){ System.out.println("Vẽ hình tròn..."); } } // Sử dụng interface: User thứ ba class TestInterface1{ public static void main(String args[]){ IVeHInh d = new HinhTron(); d.ve(); } }Kết quả khi chạy chương trình: Vẽ hình tròn...Hãy thử xem một ví dụ khác về interface java cung cấp việc triển interface INganHang interface INganHang{ float rateOfInterest(); } class Agri implements INganHang{ public float laiSuat(){ return 0.07; } } class VCB implements INganHang{ public float laiSuat(){ return 0.08; } } class TestInterface2{ public static void main(String[] args){ INganHang nganHang = new VCB(); System.out.println("Lãi suất: " + nganHang.laiSuat() * 100 + "%"); } }Kết quả khi chạy chương trình: Lãi suất: 8%Đạt được tính đa kế thừa trong Java thông qua interfaceNếu một lớp Java triển khai nhiều interface hoặc interface mở rộng nhiều interface, nó được gọi là đa kế thừa. Ví dụ: interface IInAn{ void inThongTin(); } interface IHienThi{ void hienThi(); } // Đa kế thừa class A7 implements IInAn, IHienThi{ public void inThongTin(){ System.out.println("Xin chào"); } public void hienThi(){ System.out.println("Hiển thị bản xem trước"); } public static void main(String args[]){ A7 a7 = new A7(); a7.inThongTin(); a7.hienThi(); } }Kết quả khi chạy chương trình: Xin chào Hiển thị bản xem trướcCâu hỏi: Đa kế thừa không được hỗ trợ thông qua class trong java, nhưng tại sao nó có thể được thực hiện bởi một interface?Như chúng ta đã giải thích trong chương kế thừa trong Java, Java không hỗ trợ đa kế thừa class vì sự mơ hồ. Tuy nhiên, vì đa kế thừa thông qua interface không mơ hồ nên nó được hỗ trợ. Việc triển khai của nó được cung cấp bởi class thực thi. Ví dụ: interface IInAn{ void inThongTin(); } interface IHienThi{ void hienThi(); } class TestInterface3 implements IInAn, IHienThi{ public void inThongTin(){ System.out.println("Xin chào"); } public static void main(String args[]){ TestInterface3 obj = new TestInterface3(); obj.inThongTin(); } }Kết quả khi chạy chương trình: Xin chàoKế thừa interfaceTrong Java, một class triển khai (implements) một interface, nhưng một interface này mở rộng (extends) một interface khác. interface IInAn{ void inThongTin(); } interface IHienThi extends IInAn{ void hienThi(); } class TestInterface4 implements Showable{ public void inThongTin(){ System.out.println("Xin chào"); } public void hienThi(){ System.out.println("Hiển thị bản xem trước"); } public static void main(String args[]){ TestInterface4 obj = new TestInterface4(); obj.inThongTin(); obj.hienThi(); } }Kết quả khi chạy chương trình: Xin chào Hiển thị bản xem trướcPhương thức default của Java 8 trong interfaceKể từ Java 8, chúng ta có thể có thân phương thức trong interface. Nhưng chúng ta cần đặt nó thành phương thức default. Hãy xem một ví dụ: interface IVeHinh{ void ve(); default void msg(){ System.out.println("Phương thức default"); } } class HinhChuNhat implements IVeHinh{ public void ve(){ System.out.println("Vẽ hình chữ nhật"); } } class TestInterfaceDefault{ public static void main(String args[]){ IVeHinh hinhChuNhat = new HinhChuNhat(); hinhChuNhat.ve(); hinhChuNhat.msg(); } }Kết quả khi chạy chương trình: Vẽ hình chữ nhật Phương thức defaultCâu hỏi: Interface được đánh dấu (marker) hoặc được gắn thẻ (tagged) là gì?Một interface không có data member nào được gọi là marker interface hoặc tagged interface. Ví dụ: Serializable, Cloneable, Remote , v.v. Chúng được sử dụng để cung cấp một số thông tin cần thiết cho JVM để JVM có thể thực hiện một số hành vi. Interface lồng nhau trong JavaMột interface có thể có một interface khác được gọi là interface lồng nhau (Nested Interface). Chúng ta sẽ tìm hiểu nó một cách chi tiết trong chương Nested Class. Ví dụ: interface IInAn{ void in(); // Interface được lồng trong interface khác interface IThongTinInAn{ void thongTin(); } }Như vậy, qua bài viết này, mình đã hướng dẫn bạn tìm hiểu về interface trong Java, và cùng với các ví dụ đơn giản hi vọng bạn hiểu được cách khai báo, triển khai và đạt được tính đa kế thừa thông qua interface. Chúc bạn học tốt! |