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.

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ột interface có thể bao gồm bất cứ lượng phương thức nào.

  • Một interface được viết trong một file với định dạng .java, với tên của interface cùng với tên của file.

  • Bytecode của interface xuất hiện trong một .class file.

  • Interface xuất hiện trong package, những bytecode file tương ứng phải ở trong cấu trúc thư mục có cùng tên package.

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:

  • Bạn không thể khởi tạo một interface.

  • Một interface không chứa bất cứ hàm contructor nào.

  • Tất cả các phương thức của interface đều là abstract.

  • Một interface không thể chứa một trường nào trừ các trường vừa static và final.

  • Một interface không thể kế thừa từ lớp, nó được triển khai bởi một lớp.

  • Một interface có thể kế thừa từ nhiều interface khác.

Ví dụ đơn giản về Interface trong Java

Trong 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.

interface printable{ void print[]; } class A6 implements printable{ public void print[]{System.out.println["Hello"];} public static void main[String args[]]{ A6 obj = new A6[]; obj.print[]; } }

Khi ghi đè các phương thức được định nghĩa trong interface, có một số qui tắc sau:

  • Các checked exception không nên được khai báo trong phương thức implements, thay vào đó nó nên được khai báo trong phương thức interface hoặc các lớp phụ được khai báo bởi phương thức interface.

  • Signature [ký số] của phương thức interface và kiểu trả về nên được duy trì khi ghi đè phương thức [overriding method].

  • Một lớp triển khai chính nó có thể là abstract và vì thế các phương thức interface không cần được triển khai.

Khi triển khai interface, có vài quy tắc sau:

  • Một lớp có thể triển khai một hoặc nhiều interface tại một thời điểm.

  • Một lớp chỉ có thể kế thừa một lớp khác, nhưng được triển khai nhiều interface.

  • Một interface có thể kế thừa từ một interface khác, tương tự cách một lớp có thể kế thừa lớp khác.

Đa kế thừa trong Java bởi Interface

Nế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 Java

Mộ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 Java

Ghi 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 //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.

  • Interface cũng đại diện cho mối quan hệ IS-A
  • Interface không thể khởi tạo như classs
  • Từ phiên bản JAVA 8, chúng ta có thể có phương thức default và static trong interface
  • Từ JAVA 9 thì có thể có phương thức private trong interface

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.

  • Sử dụng Interface để đạt được sự trừu tượng.
  • Interface có thể hỗ trợ chúng ta đạt được đa kế thừa [Vì Java mặc định không hỗ trợ đa kế thừa thông qua class].
  • Nó có thể được sử dụng để đạt được Loose coupling.

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 JAVA

Mộ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:

interface { // Khai báo constant fields // Khai báo phương thức trừu tượng // ... }

Tham 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 8

Kể 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 publicabstract trước phương thức trong Interface. Và nó cũng thêm các từ khóa public, staticfinal 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à interface

Như 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 JAVA

Trong 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ào

Tiế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 interface

Nế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ước

Câ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ào

Kế thừa interface

Trong 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ước

Phương thức default của Java 8 trong interface

Kể 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 default

Câ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 Java

Mộ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!

Video liên quan

Chủ Đề