Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục tìm hiểu về các interface trong Java. Chúng ta sẽ học cách thực hiện các interface và khi nào sử dụng chúng một cách chi tiết với sự trợ giúp của các ví dụ.
Trong Java, một interface định nghĩa một tập các đặc tả mà các class khác phải thực hiện. Ví dụ:
interface Polygon {
public void getArea();
}
Ở đây, Polygon là một interface. Chúng ta sử dụng từ khóa interface để khai báo một interface. Phương thức getArea() là một specification được định nghĩa trong interface Polygon. Tất cả các class sử dụng interface này phải thực thi phương thức getArea().
Một interface có thể bao gồm các phương thức và hằng số trừu tượng. Lấy ví dụ:
interface Polygon {
public static final String color = "blue";
public void getArea();
}
Trong ví dụ trên, chúng ta đã tạo ra một Interface Polygon. Nó bao gồm một biến không đổi color và một phương thức trừu tượng getArea().
Điều quan trọng cần lưu ý là, tất cả các phương thức bên trong một interface đều được ngầm định là public và tất cả các thuộc tính đều được ngầm định là public static final. Do đó, không cần thiết phải chỉ định access modifier bên trong các interface. Chẳng hạn như ta có thể viết mã trên là:
interface Polygon {
String color = "blue";
void getArea();
}
Nội dung
1. Từ khóa implements trong Interface
Giống như các class trừu tượng, chúng ta không thể khởi tạo các đối tượng của interface. Tuy nhiên, chúng ta có thể thực thi các interface trong các class khác. Trong Java, chúng ta sử dụng từ khóa implements để thực thi các interface. Ví dụ:
interface Polygon {
void getArea(int length, int breadth);
}
class Rectangle implements Polygon {
public void getArea(int length, int breadth) {
System.out.println("The area of the rectangle is " + (length * breadth));
}
}
class Main {
public static void main(String[] args) {
Rectangle r1 = new Rectangle();
r1.getArea(5, 6);
}
}
Kết quả
The area of the rectangle is 30
Trong chương trình trên, chúng ta đã tạo ra một interface Polygon. Interface này có một phương pháp trừu tượng là getArea().
Điều này có nghĩa là bất kỳ class nào thực hiện Polygon đều phải thực thi phương thức getArea().
Lưu ý rằng, class Rectangle ( class thực thi interface Polygon) cũng cần phải thực thi phương thức getArea().
2. Tại sao cần sử dụng Interface?
Bây giờ chúng ta đã biết interface là gì, hãy tìm hiểu về lý do tại sao interface được sử dụng trong Java.
- Các interface cung cấp các specification mà một class (class thực thi nó) phải tuân theo.
Trong ví dụ trên, chúng ta đã sử dụng getArea() làm specification bên trong interface Polyon. Điều này giống như đặt ra một quy tắc rằng, chúng ta sẽ có thể có được diện tích của mọi đa giác. Vì vậy, bất kỳ class nào thực thi interface Polygon triển khai phương thức getArea().
- Tương tự như các class trừu tượng, các interface giúp chúng ta đạt được tính trừu tượng hóa trong Java. Ở đây, chúng ta biết rằng phương thức getArea() giúp tính diện tích của các đa giác nhưng cách tính diện tích đối với mỗi đa giác khác nhau là khác nhau. Do đó, việc thực thi phương thức getArea() là độc lập với nhau.
- Các interface cũng được sử dụng để đạt được tính đa kế thừa trong Java. Nếu một subclass được kế thừa từ hai hoặc nhiều class, thì đó là tính đa kế thừa.
Trong Java, tính đa kế thừa là không khả thi bằng cách mở rộng các class. Tuy nhiên, một class có thể triển khai nhiều interface. Điều này cho phép chúng ta có được tính năng của tính đa kế thừa trong Java. Ví dụ:
interface Line {
...
}
interface Polygon {
...
}
class Rectangle implements Line, Polygon{
...
}
Ở đây, class Rectangle phải triển khai cả phương thức Line và Polygon.
3. Phương thức private và static trong Interface
Với việc phát hành Java 8, các interface giờ đây có thể bao gồm các phương thức tĩnh.
Tương tự như một class, chúng ta có thể truy cập các phương thức tĩnh của một interface bằng cách sử dụng các tham chiếu của nó. Ví dụ:
Polygon.staticMethod();
Ngoài ra, các interface hỗ trợ các phương thức private với việc phát hành Java 9. Bây giờ bạn có thể sử dụng các phương thức private và phương thức private static trong các interface.
Vì bạn không thể khởi tạo interface, các phương thức private được sử dụng làm phương thức hỗ trợ cho các phương thức khác trong các interface.
4. Phương thức default trong các Interface
Với việc phát hành Java 8, các phương thức được triển khai (các phương thức default) đã được tích hợp bên trong một interface. Trước đó, trong Java tất cả các phương thức đều là phương thức trừu tượng.
Để khai báo các phương thức default bên trong các interface, chúng ta sử dụng từ khóa default. Ví dụ,
public default void getSides() {
// body of getSides()
}
5. Tại sao cần sử dụng phương thức default?
Chúng ta hãy lấy một kịch bản để hiểu tại sao các phương thức default được giới thiệu trong Java.
Giả sử, chúng ta cần thêm một phương thức mới trong một interface.
Chúng ta có thể thêm phương thức trong interface của mình một cách dễ dàng mà không cần thực hiện. Tuy nhiên, câu chuyện chưa kết thúc ở đó. Tất cả các class của chúng ta triển khai interface đó phải thực thi phương thức mới thêm vào đó.
Nếu có nhiều class đang thực hiện interface này, chúng ta cần theo dõi tất cả các class này và thực hiện các thay đổi trong chúng hoặc có class không cần phương thức mới đó mà bắt nó phải kế thừa thì rất dư code. Điều này không chỉ tẻ nhạt mà còn dễ bị lỗi.
Để giải quyết điều này, Java đã giới thiệu phương thức default. Các phương thức default được kế thừa như các phương thức thông thường và nó sẽ không bắt buộc phải kể thừa.
Hãy lấy một ví dụ để hiểu rõ hơn về các phương thức default.
Ví dụ:
interface Polygon {
void getArea();
default void getSides() {
System.out.println("I can get sides of polygon.");
}
}
class Rectangle implements Polygon {
public void getArea() {
int length = 6;
int breadth = 5;
int area = length * breadth;
System.out.println("The area of the rectangle is "+area);
}
public void getSides() {
System.out.println("I have 4 sides.");
}
}
class Square implements Polygon {
public void getArea() {
int length = 5;
int area = length * length;
System.out.println("The area of the square is "+area);
}
}
class Main {
public static void main(String[] args) {
Rectangle r1 = new Rectangle();
r1.getArea();
r1.getSides();
Square s1 = new Square();
s1.getArea();
s1.getSides();
}
}
Kết quả
The area of the rectangle is 30
I have 4 sides
The area of the square is 25
I can get sides of polygon.
Trong ví dụ trên, chúng ta tạo ra một Interface Polygon. Interface Polygon này có một phương thức default là getSides() và một phương thức trừu tượng là getArea().
Class Rectangle sau đó thực hiện Polygon. Class Rectangle triển khai phương thức trừu tượng getArea() và ghi đè phương thức default getSides().
Chúng ta tạo ra một class Square khác cũng triển khai interface Polygon . Ở đây, class Square chỉ cần thực thi phương thức trừu tượng getArea(). Khi class Square gọi hàm getSides(), thì sẽ gọi đến hàm getSides() của Interface Polygon
6. Kế thừa trong interface
Tương tự như các class, interface có thể kế thừa các interface khác. Các từ khóa extends được sử dụng để kế thừa interface. Ví dụ:
interface Line {
//members of Line interface
}
interface Polygon extends Line {
//members of Polygon interface and Line interface
}
Trong ví dụ trên, interface Polygon kế thừa interface Line. Bây giờ, nếu một class triển khai Polygon, nó sẽ thực thi tất cả các class trừu tượng của cả Line và Polygon.
Lưu ý rằng một interface có thể kế thừa nhiều interface tương tự như một class triển khai nhiều interface. Lấy ví dụ:
interface A {
...
}
interface B {
...
}
Interface C extends A, B {
...
}
7. Sự khác nhau giữa lớp abstract và interface
Abstract class và interface đều được sử dụng để có được sự trừu tượng mà ở đó chúng ta có thể khai báo các phương thức trừu tượng. Nhưng có một vài sự khác nhau giữa abstract class và interface:
Abstract class | Interface |
Abstract class có phương thức abstract (không có thân hàm) và phương thức non-abstract (có thân hàm). | Interface chỉ có phương thức abstract. Từ java 8, nó có thêm các phương thức default và static. |
Abstract class không hỗ trợ đa kế thừa. | Interface có hỗ trợ đa kế thừa. |
Abstract class có các biến final, non-final, static và non-static. | Interface chỉ có các biến static và final. |
Từ khóa abstract được sử dụng để khai báo abstract class. | Từ khóa interface được sử dụng để khai báo interface. |
8. Kết
Như vậy chúng ta đã tìm hiểu xong Interface trong lập trình Java. Cảm ơn các bạn đã theo dõi bài viết của mình. Chúc các bạn thành công. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn: