Xin chào mọi người! Chúng ta đã quá quen thuộc với interface trong lập trình. Nhưng đối với một số bạn sinh viên, intern hoặc thậm chí là fresher, interface có thể vẫn còn khá mới mẻ (đặc biệt khi áp dụng vào thực tế). Chúng ta biết rằng interface giống như một bản thiết kế, một khuôn mẫu cho các lớp kế thừa nó. Nghĩa là khi khai báo các phương thức, sự kiện và các lớp implement nó sẽ phải định nghĩa lại toàn bộ các phương thức đó. Nhưng liệu có khi nào bạn đặt ra câu hỏi rằng nếu ta cùng implement 2 interface và trong hai interface đó cùng có một phương thức trùng tên không?
Contents
Định nghĩa về interface
Trước khi chúng ta đi vào chi tiết, hãy ôn lại kiến thức về Interface. Interface là một loại abstract trong Java, nó bao gồm các hành vi mà các lớp triển khai nó bắt buộc phải thực hiện. Interface được nhận biết bằng từ khóa “interface”. Các phương thức trong interface là public và abstract. Từ Java 8, chúng ta có thể định nghĩa và triển khai các static method.
Bạn đang xem: Điều gì xảy ra nếu ta implements 2 interface có cùng 1 phương thức giống nhau
Xem thêm : Toán lớp 4 dấu hiệu chia hết cho 3 – kiến thức và bài tập
Hãy nhớ rằng interface không phải là một lớp. Khi chúng ta triển khai một interface, chúng ta bắt buộc phải thực hiện các phương thức trong interface đó.
interface Animal {
void voice();
}
class Cat implements Animal {
@Override
public void voice() {
System.out.println("meow");
}
}
READ MORE:
Nếu cùng implement 2 interface và trong hai interface có cùng một method trùng tên
Giả sử chúng ta có hai interface là Person và Cat, cả hai interface này đều có một method là voice. Chúng ta có một lớp là TranDucBo sẽ implement cả hai interface đó như sau:
interface Person {
void voice();
}
interface Cat {
void voice();
}
class TranDucBo implements Person, Cat {
@Override
public void voice() {
System.out.println("meo méo meo mèo meo");
}
}
Bạn có thể đoán xem khi gọi phương thức voice trong lớp TranDucBo, điều gì sẽ xảy ra? Đáp án là:
public static void main(String[] args) {
TranDucBo nhiMuBu = new TranDucBo();
nhiMuBu.voice(); // meo méo meo mèo meo
Person person = new TranDucBo();
person.voice(); // meo méo meo mèo meo
Cat cat = new TranDucBo();
cat.voice(); // meo méo meo mèo meo
}
Xem thêm : Cool Off là gì và cấu trúc cụm từ Cool Off trong câu Tiếng Anh
Bạn chỉ cần đánh dấu @Override trên một phương thức voice là đủ. Và không quan trọng bạn sử dụng TranDucBo như là Person hay Cat thì vẫn chỉ có một phương thức để gọi. Nhưng bạn có để ý điều đặc biệt ở đây không? Đó chính là cả hai phương thức voice trong Person và Cat đều có kiểu trả về là void. Chúng ta gọi Person.voice() và Cat.voice() là @Override-equivalent. Vậy nếu chúng ta implement hai phương thức không phải @Override-equivalent thì điều gì sẽ xảy ra?
interface Person {
void voice();
}
interface Cat {
String voice();
}
class TranDucBo implements Person, Cat {
//// Sẽ không biên dịch thành công!!!
// "types Person and Cat are incompatible;
// both define voice(), but with unrelated return types"
@Override
public void voice() {
System.out.println("meo méo meo mèo meo");
}
}
Khi này, trình biên dịch sẽ báo lỗi biên dịch. Điều này nhắc cho chúng ta rằng khi kế thừa interface, chúng ta phải tuân thủ quy tắc khai báo. Ở đây, Person và Cat định nghĩa voice() với hai kiểu trả về không tương thích: void và String. Vì lí do này mà bạn không thể sử dụng cả hai phương thức void voice() và String voice() trong một kiểu, ví dụ này dẫn đến lỗi biên dịch.
READ MORE:
Tổng kết
Bạn có thể kế thừa các interface có cùng phương thức, nhưng điều kiện là chúng phải là @Override-equivalent. Vì chúng ta đang sử dụng @Override-equivalent, nên chỉ có một phương thức để triển khai và không có gì để phân biệt/lựa chọn. Trình biên dịch không xác định phương thức nào dành cho interface nào, vì một khi chúng ta xác định là @Override-equivalent, chúng ta đã có cùng một phương thức.
Tham khảo thêm
- JLS 8.4.2 Method Signature
- JLS 8.4.8 Inheritance, Overriding, and Hiding
- JLS 8.4.8.3 Requirements in Overriding and Hiding
- JLS 8.4.8.4 Inheriting Methods with Override-Equivalent Signatures
Caption: Điều gì xảy ra nếu ta implements 2 interface có cùng 1 phương thức giống nhau?
Nguồn: https://ispacedanang.edu.vn
Danh mục: Học tập