Trong phần trước chúng ta đã tìm hiểu về interface, chúng ta đã biết là khi viết thêm các phương thức và interface thì chúng ta phải code các phương thức đó cho toàn bộ các lớp đã implement interface đó, nếu không thì sẽ bị lỗi biên dịch.
Phương thức default
Phương thức default (mặc định) cho phép chúng ta viết thêm phương thức mới vào interface mà không lo bị lỗi biên dịch.
Giả sử chúng ta có đoạn code interface Blog
như sau:
public interface Blog { void new_post(); void delete_post(); }
Và chúng ta định nghĩa lớp PhoCode
implement lại interface này như sau:
public class PhoCode implements Blog { String title = "phocode.com"; void new_post() { // ... } void delete_post() { // ... } }
Interface Blog
có 2 phương thức là new_post()
và delete_post()
. Giả sử chúng ta muốn thêm một phương thức mới vào interface này là update_post()
như sau:
public interface Blog { void new_post(); void delete_post(); void update_post(); }
Chúng ta sẽ phải viết thêm phần code cho phương thức update_post()
trong lớp PhoCode.
public class PhoCode implements Blog { String title = "phocode.com"; void new_post() { // ... } void delete_post() { // ... } void update_post() { // ... } }
Việc viết lại các phương thức mới của interface vào toàn bộ các lớp có implement rất mệt mỏi. Do đó chúng ta có thể khai báo phương thức mặc định trong interface như sau:
public interface Blog { void new_post(); void delete_post(); default void update_post() { // ... } }
Chúng ta khai báo một phương thức mà mặc định bằng cách đưa từ khóa default
ra trước tên phương thức, tất cả các phương thức trong interface đều có phạm vi hoạt động là public
. Đối với phương thức mặc định thì chúng ta viết phần code cho phương thức đó luôn, tức là có phần ngoặc nhọn {}
thay vì dấu chấm phẩy phía sau tên phương thức.
Và khi khai báo một phương thức là mặc định thì các lớp implement lại interface đó không cần phải viết lại phần code cho phương thức mặc định và có thể gọi đến các phương thức mặc định như bình thường.
Kế thừa interface có phương thức mặc định
Các interface kế thừa lại interface có chứa phương thức mặc định có thể thực hiện các việc sau:
- Không khai báo lại các phương thức mặc định, Java sẽ tự hiểu là kế thừa lại 100% phương thức mặc định
- Kế thừa lại phương thức mặc định nhưng không khai báo phần thân phương thức
{}
, lúc này phương thức đó sẽ trở lại là phương thức trừu tượng. - Kế thừa lại và có khai báo phần thân phương thức, tức là override lại phương thức mặc định
Giả sử chúng ta có interface BlogV2
kế thừa Blog như sau:
public interface BlogV2 extends Blog { }
Phương thức BlogV2
không khai báo phương thức update_post(),
tức là mặc định sẽ kế thừa lại hoàn toàn phương thức này.
Nếu khai báo như sau:
public interface BlogV2 extends Blog { public void update_post(); }
Thì lúc này phương thức update_post()
trong BlogV2
trở lại là phương thức trừu tượng, và tất cả các lớp implement interface BlogV2
sẽ phải code phương thức update_post().
Và cuối cùng chúng ta cũng có thể khai báo lại phương thức này là phương thức default,
tức là ghi đè phương thức:
public interface BlogV2 extends Blog { default void update_post() { // ... } }
Phương thức static
Cũng tương tự như các class, chúng ta có thể khai báo phương thức static (tĩnh) bên trong một interface. Ví dụ:
public interface Blog { String title = "phocode.com"; static String getTitle() { return this.title; } }
Chúng ta khai báo một phương thức static
bằng cách ghi từ khóa static
ra trước tên phương thức. Sau tên phương thức chúng ta khai báo phần thân phương thức trong cặp dấu ngoặc nhọn {}
.
Phương thức static
là phương thức dùng chung cho toàn bộ interface giống như với class, tức là tất cả các đối tượng implement interface có phương thức static
đều kế thừa luôn 100% phương thức static
đó, không thể override lại được.