Điện thoại/ Zalo
0389934723
Bài 16: Interface trong Java
Ở những bài trước mình cũng có sử dụng interface rồi nhưng chưa giải thích về nó, nên bài này mình sẽ giới thiệu với mọi người về interface trong Java và những thứ liên quan đến nó.
1. Interface trong Java.
Trong Java interface là một kiểu dữ liệu tham chiếu (reference type), giống như class. Nó cho phép chúng ta định nghĩa hằng số, tên phương thức, phương thức tĩnh, và phương thức default.
Đối với phương thức tĩnh và phương thức default thì chúng ta có thể khai báo chúng như đối với class thường (có code logic bên trong).
Để khai báo một interface chúng ta sử dụng cú pháp sau:
access_modifier interface Name {
// code
}
Trong đó:
assess_modifier
là phạm vi truy cập của interface.assess_modifier
sẽ là 1 trong 4 giá trị sau:public
,protected
,private
,default
hoặc bỏ trống.Name
là tên của interface.
VD: Định nghĩa interface XeInterface
.
public interface XeInterface {
void setSoBanh(int soBanh);
int getSoBanh();
void setTocDo(int tocDo);
int getTocDo();
public static void Print(String message) {
System.out.println(message);
}
}
Interface cũng có thể kế thừa một hoặc nhiều interface khác với cú pháp tương tự như đối với class.
VD: Kế thừa interface.
public interface XeInterface {
// code
}
public interface XeDapInterface extends XeInterface {
// code
}
public interface XeDienInterface extends XeInterface {
// code
}
public interface XeDapDienInterface extends XeDapInterface, XeDienInterface {
// code
}
Trong ví dụ trên mình đã khai báo interface XeDapInterface
kế thừa XeInterface
và XeDienInterface
kế thừa XeInterface
. Rồi tiếp đó mình lại khai báo XeDapDienInterface
kế thừa XeDapInterface
và XeDienInterface
.
2. Thực thi (implement) interface.
Khi thực thi (implement) một interface thì chúng ta cần phải Override lại các phương thức đã được định nghĩa tên ở interface (chỉ những phương thức thường). Và kiểu dữ liệu trả về của phương thức phải giống với kiểu dữ liệu trả về đã được khai báo ở interface, tham số truyền vào phương thức cũng phải có kiểu dữ liệu giống như đã khai báo trong interface.
Để thực thi một interface thì chúng ta sử dụng từ khóa implements
sau tên class khi định nghĩa. Và cũng giống như interface thì một class có thể thực thi nhiều interface với cú pháp tương tự với interface.
VD: Mình sẽ thực thi lại XeInterface
ở ví dụ trên.
– XeInterface
:
public interface XeInterface {
void setSoBanh(int soBanh);
int getSoBanh();
void setTocDo(int tocDo);
int getTocDo();
public static void print(String message) {
System.out.println(message);
}
}
– class Xe.java
:
public class Xe implements XeInterface {
private int soBanh;
private int tocDo;
@Override
public void setSoBanh(int soBanh) {
this.soBanh = soBanh;
}
@Override
public int getSoBanh() {
return soBanh;
}
@Override
public void setTocDo(int tocDo) {
this.tocDo = tocDo;
}
@Override
public int getTocDo() {
return tocDo;
}
}
Như các bạn đã thấy thì ở class Xe
mình phải định nghĩa lại toàn bộ phương thức thường đã được khai báo tên ở trong XeInterface
, nếu không định nghĩa lại thì trình biên dịch sẽ báo lỗi. Riêng đối với phương thức default
và static
method thì các bạn không cần phải định nghĩa lại.
3. Dùng interface như một kiểu dữ liệu.
Như ở phía trên mình có nói interface là một kiểu dữ liệu tham chiếu nên khi các bạn khai báo một class có implement interface thì chúng ta hoàn toàn có thể khởi tạo đối tượng đó với kiểu dữ liệu là interface đó.
VD: Khởi tạo class Xe
ở trên với kiểu dữ liệu là interface XeInterface
.
public class Main {
public static void main(String[] args) {
XeInterface xe = new Xe();
}
}
Khi một class có implement interface thì khi check instanceof object đó với interface thì kết quả vẫn sẽ trả về true.
VD:
public class Main {
public static void main(String[] args) {
Xe xe = new Xe();
if (xe instanceof XeInterface) {
System.out.println("Xe instanceof XeInterface");
}
}
}
4. Mức độ ưu tiên phương thức.
Mức độ ưu tiên trong interface về cơ bản thì cũng giống như class.
Trong Java các method được khai báo trong class sẽ được ưu tiên hơn trong interface.
VD: Mình có khai báo các class và inteface như sau
– XeInterface
public interface XeInterface {
default void print() {
System.out.println("This is XeInterface");
}
}
– class Xe.java
public class Xe {
public void print() {
System.out.println("This is Xe");
}
}
– class XeDap.java
public class XeDap extends Xe implements XeInterface {
// code
}
– class Main.java
public class Main {
public static void main(String[] args) {
XeDap xeDap = new XeDap();
xeDap.print();
}
}
Kết quả:
This is Xe
Như các bạn đã thấy, method print được khai báo trong class Xe
sẽ được ưu tiên hơn so với interface XeInterface
.
Để gọi phương thức đã bị ghi đè trong interface chúng ta cũng sử dụng từ khóa super
, nhưng trước đó chúng ta cần xác định thêm interface name phía trước nó để Java hiểu được bạn cần gọi method của interface nào.
VD:
– XeInterface
public interface XeInterface {
default void print() {
System.out.println("This is XeInterface");
}
}
– class Xe.java
public class Xe implements XeInterface {
public void print() {
XeInterface.super.print();
System.out.println("This is Xe");
}
}
– class Main.java
public class Main {
public static void main(String[] args) {
XeDap xeDap = new XeDap();
xeDap.print();
}
}
Kết quả:
This is XeInterface
This is Xe
5. Lời kết.
Interface xuất hiện ở mọi nơi trong Java, chính vì vậy mọi người nên để ý hơn về phần này.