Trong Java, từ khóa extends được sử dụng để thực hiện tính kế thừa, cho phép một lớp con kế thừa các thuộc tính và phương thức từ lớp cha của nó. Việc sử dụng extends giúp tăng tính tái sử dụng của mã nguồn và tạo ra mối quan hệ "IS-A" giữa các lớp.
I. Tính kế thừa trong Java
Tính kế thừa trong Java cho phép đối tượng con nhận được tất cả các thuộc tính và hành vi từ đối tượng cha của nó. Ý tưởng đằng sau tính kế thừa là bạn có thể xây dựng các lớp mới dựa trên các lớp đã tồn tại.
Khi bạn kế thừa từ một lớp đã có, bạn có thể tái sử dụng các phương thức và trường của lớp cha và cũng có thể thêm các phương thức và trường mới. Tính kế thừa biểu diễn quan hệ "IS-A", còn được gọi là mối quan hệ cha-con.
Ví dụ, nếu chúng ta có một lớp A, chúng ta có thể tạo lớp B mới kế thừa từ lớp A để sử dụng lại các thuộc tính và phương thức của lớp A mà không cần phải viết lại hoặc sao chép lại mã nguồn.
II. Cách sử dụng từ khóa extends
Để sử dụng tính kế thừa trong Java, chúng ta sử dụng từ khóa extends.
class Subclass-name extends Superclass-name {
// methods and fields
}
Từ khóa extends cho biết rằng bạn đang tạo một lớp mới và kế thừa từ một lớp đã tồn tại. Trong Java, lớp được kế thừa được gọi là lớp cha, và lớp kế thừa được gọi là lớp con.
Hãy xem ví dụ sau để hiểu cách sử dụng extends trong Java:
class myClass {
public myClass() {
// Constructor
}
int number = 200;
}
public class TwoClass extends myClass {
public TwoClass() {
// Constructor
}
public static void main(String[] args) {
TwoClass obj = new TwoClass();
System.out.println(obj.number);
}
}
Trong ví dụ này, chúng ta có hai lớp: myClass và TwoClass. Lớp myClass có một thuộc tính số nguyên là number. Lớp TwoClass kế thừa từ lớp myClass và sử dụng thuộc tính number của lớp cha. Kết quả của đoạn mã này sẽ là "200".
III. Ví dụ về tính kế thừa trong Java
Trong Java, có ba kiểu kế thừa: kế thừa đơn, kế thừa đa cấp và kế thừa đa cấp.
Khi một lớp kế thừa từ nhiều lớp được gọi là kế thừa đa cấp. Trong Java, kế thừa đa cấp chỉ được hỗ trợ thông qua giao diện (interface).
Ví dụ về kế thừa đơn
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("barking...");
}
}
public class TestInheritance1 {
public static void main(String args[]) {
Dog d = new Dog();
d.bark();
d.eat();
}
}
Kết quả là:
barking...
eating...
Ví dụ về kế thừa đa cấp
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("barking...");
}
}
class BabyDog extends Dog {
void weep() {
System.out.println("weeping...");
}
}
public class TestInheritance2 {
public static void main(String args[]) {
BabyDog d = new BabyDog();
d.weep();
d.bark();
d.eat();
}
}
Kết quả là:
weeping...
barking...
eating...
Ví dụ về kế thừa thứ bậc
class Animal {
void eat() {
System.out.println("eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("barking...");
}
}
class Cat extends Animal {
void meow() {
System.out.println("meowing...");
}
}
public class TestInheritance3 {
public static void main(String args[]) {
Cat c = new Cat();
c.meow();
c.eat();
}
}
Kết quả là:
meowing...
eating...
IV. Phân biệt extends và implements trong Java
Trong Java, extends và implements là hai từ khóa được sử dụng phổ biến. Tuy nhiên, một số lập trình viên mới học chưa thực sự hiểu sự khác biệt giữa chúng. Ở đây, chúng ta sẽ giải thích sự khác biệt giữa extends và implements trong Java.
- extends: kế thừa từ các lớp
- implements: kế thừa từ các interface
Mặc dù cả hai từ khóa extends và implements đều được sử dụng để thực hiện kế thừa, nhưng có sự khác biệt giữa chúng. extends được sử dụng để kế thừa từ một lớp tồn tại, trong khi implements được sử dụng để kế thừa từ các interface.
Dưới đây là một số điểm khác biệt quan trọng giữa extends và implements trong Java:
- Một lớp có thể kế thừa từ một lớp khác, nhưng không thể extends từ một interface.
interface I { }
class A { }
class B extends A { }
class C extends I { }
Trong ví dụ này, khi bạn biên dịch chương trình, bạn sẽ gặp lỗi sau:
Main.java:27: no interface expected here
class C extends I {
- Khi sử dụng extends, một lớp chỉ có thể kế thừa từ một lớp khác. Dưới đây là mã lỗi khi bạn cố gắng extends từ nhiều lớp:
class C extends A, B { }
Sẽ xuất hiện lỗi:
Main.java:27: '{' expected
class C extends A, B {
- Một interface có thể extends từ một interface khác.
interface J extends I { }
- Một lớp có thể implements từ nhiều interface bằng cách sử dụng implements.
class D implements I, J, K { }
- Một lớp có thể sử dụng cả extends và implements.
class E extends A implements I, J { }
- Một interface không thể implements từ một interface. Điều này không thể xảy ra, và khi chạy chương trình, sẽ xảy ra ngoại lệ:
interface L implements J { }
Hy vọng rằng bài viết này đã giải thích rõ sự khác biệt giữa extends và implements trong Java. Việc hiểu rõ sự khác biệt này sẽ giúp bạn áp dụng chúng một cách chính xác trong thực tế.