Thừa kế đóng một vai trò rất quan trọng trong việc tiết kiệm thời gian và công sức của người lập trình. Hầu hết các chương trình trong thực tếđều sử dụng đa thừa kế. Trong đa thừa kế, chúng ta có thể thừa kế các phương thức và thuộc tính từ một số lớp khác nhau. Java không hỗ trợ đa thừa kế. Tuy nhiên, nhận thấy tầm quan trọng của đa thừa kế trong Java, Java đã đưa ra khái niệm interface. Với giao tiếp ta có thể xác định một lớp phải làm gì nhưng không xác định cách làm thế nào.
• Định nghĩa
Một giao tiếp là một tập hợp các định nghĩa phương thức (không có cài đặt). Một giao tiếp cũng có thểđịnh nghĩa các hằng.
Ta cũng có thểđặt câu hỏi vậy giao tiếp khác gì so với các lớp trừu tượng? Dưới đây là những sự khác biệt giữa giao tiếp và các lớp trừu tượng:
o Một giao tiếp không thể thực thi bất kỳ phương thức nào, ngược lại một lớp trừu tượng có thể thực thi một số phương thức nào đó.
o Một lớp có thể thực thi nhiều giao tiếp nhưng một lớp chỉ có một lớp cha.
o Một giao tiếp không phải là bộ phận của sơ đồ phân cấp lớp, các lớp có thể thực thi cùng một giao tiếp.
• Khai báo một giao tiếp
Cú pháp chung khi khai báo một giao tiếp là
public interface InterfaceName extends SuperInterfaces {
//Thân giao tiếp }
Hai thành phần bắt buộc trong một khai báo giao tiếp là-từ khóa interface và tên của giao tiếp. Từ khóa bổ trợ truy xuất là public chỉ ra rằng giao tiếp có thểđược sử dụng bởi bất kỳ lớp nào bất kỳ gói nào. Nếu không xác định giao tiếp là public thì giao tiếp sẽ chỉ có thể truy xuất bởi các lớp được định nghĩa trong cùng gói với giao tiếp.
Một khai báo giao tiếp có thể có một thành phần khác: danh sách các giao tiếp cha. Một giao tiếp có thể thừa kế các giao tiếp khác, giống như một lớp có thể thừa kế hoặc là lớp của lớp khác. Danh sách các giao tiếp cha được phân cách bởi dấu phẩy.
Thân giao tiếp
Thân giao tiếp chứa các khai báo phương thức cho tất cả các phương thức có trong giao tiếp. Một khai báo phương thức trong một giao tiếp kết thúc bởi dấu chấm phẩy (;) vì một giao tiếp không cung cấp cách cài đặt cho các phương thức được khai báo trong nó.
Một giao tiếp có thể chứa các khai báo hằng ngoài các khai báo phương thức. Các khai báo thành phần trong một giao tiếp không được phép sử dụng một số từ khóa bổ trợ như private, protected transient, volatile, hoặc synchronized trong các khai báo thành phần của một giao tiếp.
Trong ví dụ sau ta sẽ tìm hiểu cách định nghĩa một giao tiếp và cách thực thi một giao tiếp trong.
public interface CalculatorInterface {
public double add(double x, double y); public double sub(double x, double y); public double mul(double x, double y); public double div(double x, double y); }
• Thực thi giao tiếp
Một giao tiếp định nghĩa một tập hợp hợp các quy ước về hành vi. Một lớp thực thi một giao tiếp tuân theo những quy ước đã được khai báo trong giao tiếp đó. Để khai báo một lớp thực thi một giao tiếp, ta đưa vào mệnh đề implements trong khai báo lớp. Một lớp có thể thực thi nhiều giao tiếp (Java hỗ trợ đa thừa kế giao tiếp), vì vậy sau từ khóa implements là một danh sách các giao tiếp được thực thi bởi một lớp.
Chú ý: Mệnh đề implements đứng sau mệnh đề extends nếu tồn tại mệnh đề extends.
class CalculatorTest implements CalculatorInterface {
public double add(double x, double y) {
return x+y; }
public double sub(double x, double y) {
return x-y; }
public double mul(double x, double y) {
return x*y; }
public double div(double x, double y) {return x/y;
}
public static void main(String[] args) throws Exception {
CalculatorInterface cal=new CalculatorTest(); if(args.length!=2)
System.out.println("Cach chay chuong trinh: java CalculatorImpl so1 so2"); return; } else { double x,y,z; x=Double.parseDouble(args[0]); y=Double.parseDouble(args[1]); System.out.println(x+"+"+y+"="+cal.add(x,y)); System.out.println(x+"-"+y+"="+cal.sub(x,y)); System.out.println(x+"*"+y+"="+cal.mul(x,y)); System.out.println(x+"/"+y+"="+cal.div(x,y)); } } } Kết quả thực hiện chương trình là C:\MyJava>java CalculatorTest 12 3 12.0+3.0=15.0 12.0-3.0=9.0 12.0*3.0=36.0 12.0/3.0=4.0 Sử dụng giao tiếp như là một kiểu
Khi ta định nghĩa một giao tiếp mới, ta có thể định nghĩa kiểu dữ liệu tham chiếu mới. Giao tiếp có thểđược sử dụng khi khai báo một biến tham chiếu. Giả sử MyInterface là một giao tiếp thì ta có thể khai báo như sau:
MyInterface mi;