Tính kế thừa trong Java - Từ khóa extends và implements trong Java
Kế thừa trong java là sự liên quan giữa hai class với nhau, trong đó có class cha (superclass) và class con (subclass). Khi kế thừa class con được hưởng tất cả các phương thức và thuộc tính của class cha. Cùng eLib.VN tìm hiểu về tính kế thừa trong Java qua bài viết dưới đây.
Mục lục nội dung
1. Tại sao sử dụng tính kế thừa trong Java?
Tính kế thừa trong Java là môt kỹ thuật mà trong đó một đối tượng thu được tất cả thuộc tính và hành vi của đối tượng cha. Ý tưởng đằng sau tính kế thừa trong Java là bạn có thể tạo các lớp mới mà được xây dựng dựa trên các lớp đang tồn tại. Khi bạn kế thừa từ một lớp đang tồn tại, bạn có thể tái sử dụng các phương thức và các trường của lớp cha, và bạn cũng có thể bổ sung thêm các phương thức và các trường khác. Tính kế thừa biểu diễn mối quan hệ IS-A, còn được gọi là mối quan hệ cha-con.
-
Để ghi đè phương thức (Method Overriding), do đó có thể thu được tính đa hình tại runtime.
-
Để làm tăng tính tái sử dụng của code.
2. Cú pháp của Tính kế thừa trong Java
class ten_lop_con extends ten_lop_cha {
//cac phuong thuc va cac truong
}
Từ khóa extends chỉ rằng bạn đang tạo một lớp mới mà kế thừa từ một lớp đang tồn tại. Trong Java, một lớp mà được kế thừa được gọi là một lớp cha. Lớp mới được gọi là lớp con.
Trong ví dụ sau, Programmer là lớp con và Employee là lớp cha. Mối quan hệ giữa hai lớp là Programmer IS-A Employee. Nghĩa là Programmer là một kiểu của Employee.
class Employee {
float salary = 40000;
}
class Programmer extends Employee {
int bonus = 10000;
public static void main(String args[]) {
Programmer p = new Programmer();
System.out.println("Luong Lap trinh vien la:" + p.salary);
System.out.println("Bonus cua Lap trinh vien la:" + p.bonus);
}
}
Ở trên, đối tượng Programmer có thể truy cập trường của riêng lớp nó cũng như của lớp Employee, đó là ví dụ cho tính tái sử dụng.
3. Các loại kế thừa trong Java
Trên cơ sở các lớp thì có 3 loại kế thừa trong Java, đó là single (đơn), multilevel (nhiều tầng) và hierarchical (có cấu trúc). Trong lập trình Java, đa kế thừa (multiple) và kế thừa lai (hybrid) chỉ được hỗ trợ thông qua Interface. Chúng ta sẽ tìm hiểu về Interface trong chương sau đó.
Ghi chú: Đa kế thừa không được hỗ trợ trong Java thông qua lớp. Khi một lớp kế thừa từ nhiều lớp, thì đây là đa kế thừa.
Câu hỏi: Tại sao đa kế thừa không được hỗ trợ trong Java thông qua lớp?
Trả lời: Để giảm tính phức tạp và làm đơn giản hóa ngôn ngữ, đa kế thừa không được hỗ trợ trong Java. Giả sử có tình huống có ba lớp là A, B và C. Lớp C kế thừa lớp A và B. Nếu các lớp A và B có cùng phương thức và bạn gọi nó từ đối tượng lớp con, thì điều này gây là tính lưỡng nghĩa là để gọi phương thức của lớp A hoặc lớp B.
class A {
void msg() {
System.out.println("Hello");
}
}
class B {
void msg() {
System.out.println("Welcome");
}
}
class C extends A,
B { //gia su neu no da co
Public Static void main(String args[]) {
C obj = new C();
obj.msg(); //Bay gio phuong thuc msg() nao se duoc goi?
}
}
Chương trình trên sẽ cho một Compile Time Error.
Khi bạn đã hiểu rõ về từ khóa extends, chúng ta cùng tìm hiểu về từ khóa implements trong quan hệ IS-A.
Từ khóa implements được sử dụng bởi các lớp mà kế thừa từ Interface. Interface có thể không bao giờ được kết thừa bởi các lớp.
public interface A {}
public class B implements A {}
public class C extends B {}
4. Từ khóa instanceof trong Java
Bây giờ chúng ta sẽ dùng toán tử instanceof để kiểm tra xem B có phải là một A và dog có phải là một A.
interface A {}
class B implements A {}
public class C extends B {
public static void main(String args[]) {
B m = new B();
C d = new C();
System.out.println(m instanceof A);
System.out.println(d instanceof B);
System.out.println(d instanceof A);
}
}
Kết quả in ra sẽ như sau:
true
true
true
5. Quan hệ HAS-A trong Java
Có những quan hệ chủ yếu dựa vào cách sử dụng. Nó xác định có hay không một lớp cụ thể HAS-A. Quan hệ này giúp chúng ta giảm được dư thừa trong code cũng như tránh các bug.
Cùng xem ví dụ dưới đây:
public class Vehicle {}
public class Speed {}
public class Van extends Vehicle {
private Speed sp;
}
Điều này chỉ ra rằng lớp Van có quan hệ HAS-A với lớp Speed. Việc sử dụng lớp riêng rẽ cho lớp Speed, chúng ta không cần thiết phải đặt toàn bộ code của lớp Speed bên trong lớp Van, điều này tăng tính tái sử dụng của lớp Speed cho nhiều ứng dụng.
Một đặc điểm quan trọng nữa phải ghi nhớ là Java chỉ hỗ trợ kế thừa đơn. Điều này nghĩa là một lớp không thể kế thừa từ nhiều hơn một lớp. Do đó, đoạn code dưới đây là không hợp lệ:
public class C extends A,
B {}
Mặc dù vậy một lớp vẫn có thể implement một hoặc nhiều interface. Điều này loại bỏ khả năng không thể đa kế thừa trong Java.
Trên đây là bài viết của eLib.VN về tính kế thừa trong Java. Tư tưởng của kế thừa trong java là có thể tạo ra một class mới được xây dựng trên các lớp đang tồn tại. Vì vậy rất tiết kiệm thời gian và công sức. Hy vọng bài viết hữu ích cho bạn đọc.
Tham khảo thêm
- doc Đối tượng và lớp (class) trong Java
- doc Phương thức trong Java
- doc Nạp chồng phương thức trong Java
- doc Constructor trong Java
- doc Từ khóa static trong Java
- doc Từ khóa this trong Java
- doc Ghi đè phương thức trong Java
- doc Kiểu trả về covariant trong Java
- doc Từ khóa super trong Java
- doc Từ khóa final trong Java
- doc Tính đa hình trong Java
- doc Gắn kết tĩnh và Gắn kết động (Dynamic Binding) trong Java
- doc Toán tử instanceof trong Java
- doc Tính trừu tượng trong Java
- doc Abstract Class trong Java
- doc Interface trong Java
- doc Phân biệt lớp abstract và Interface trong Java
- doc Package trong Java
- doc Các kiểu Modifier trong Java
- doc Access Modifier trong Java
- doc Non Access Modifier trong Java
- doc Tính đóng gói trong Java
- doc Lớp Object trong Java
- doc Nhân bản đối tượng trong Java
- doc Mảng (Array) trong Java
- doc Lớp Wrapper trong Java
- doc Truyền giá trị và tham chiếu trong Java
- doc Từ khóa strictfp trong Java
- doc Regular Expression trong Java