Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục tìm hiểu về tính kế thừa trong lập trình hướng đối tượng. Ở bài này, mình sẽ đi qua những nội dung như sau:
Nội dung
1. Khái niệm kế thừa
Kế thừa có nghĩa là thừa hưởng lại, ví dụ như tài sản của ba mẹ sẽ được giao lại cho con cái.
Kế thừa trong lập trình (Inheritance) có nghĩa là một lớp sẽ thừa hưởng lại những thuộc tính, phương thức từ lớp khác.
Việc sử dụng kế thừa nhằm tái sử dụng code đã viết trước đó, thuận tiện trong việc bảo trì và nâng cấp chương trình.
2. Khai báo và sử dụng kế thừa
Cú pháp:
class <tên lớp con> extends <tên lớp cha> {
}
Ví dụ: Chúng ta có 2 lớp Person và Student như sau
Ta thấy 2 lớp Person và Student có chung thuộc tính và phương thức. Vì vậy, ta sẽ để nguyên code ở lớp Person lại:
package KeThua;
public class Person {
public String name;
public int age;
public float height;
public Person(String name, int age, float height) {
this.name = name;
this.age = age;
this.height = height;
}
public void getInfo() {
System.out.println("Name:" + this.name);
System.out.println("Age:" + this.age);
System.out.println("Height:" + this.height);
}
}
Bây giờ ta chỉ cần cho lớp Student kế thừa Person như sau:
package KeThua;
public class Student extends Person {
public Student(String name, int age, float height) {
super(name, age, height);
}
}
Trong phương thức khởi tạo Student, ta sẽ dùng từ khóa super để cho lớp con truy cập các những thứ liên quan đến lớp cha. Như ví dụ trên thì ta dùng super() để gọi phương thức khởi tạo lớp cha.
Tiếp theo, ta thử khởi tạo đối tượng Student và gọi phương thức getInfo():
package KeThua;
public class MainClass {
public static void main(String[] args) {
Student a = new Student("phuong le", 21, 1.7f);
a.getInfo();
}
}
Theo kết quả, đối tượng a sử dụng được phương thức getInfo() từ lớp cha
3. Chú ý về kế thừa
3.1. Slogan đặc trưng kế thừa: “Cha có thì con có, con có chưa chắc cha đã có”
Tính chất kế thừa các ngôn ngữ lập trình hướng đối tượng đa số đều tương đồng với nhau về tính chất. Có thể các bạn không nhớ khái niệm và cú pháp, nhưng chỉ cần hiểu câu nói trên là bạn đã hiểu về kế thừa.
Ví dụ: Như ví dụ trước thì lớp Student kế thừa Person, ngoài những thuộc tính kế thừa ra, ta muốn thêm thuộc tính universityName cho Student
package KeThua;
public class Student extends Person {
public String universityName;
public Student(String name, int age, float height, String universityName) {
super(name, age, height);
this.universityName = universityName;
}
}
Như vậy theo đúng tính chất: lớp cha Person có name, age, height thì lớp con Student có. Lớp con Student có universityName thì lớp cha Person không có.
3.2. Tận dụng từ khóa super để bảo trì và nâng cấp code
Từ khóa super mục đích chính truy cập những phương thức của lớp cha. Trong việc phát triển phần mềm, ta cần nâng cấp chương trình. Việc tận dụng từ khóa super sẽ giúp ta vừa tận dụng những dòng code trước đó và viết tiếp code mới.
Ví dụ: ta thấy phương thức getInfo() chỉ trả về thông tin name, age, height. Bây giờ, ta sẽ nâng cấp phương thức có thể trả về thông tin universityName ở lớp Student
package KeThua;
public class Student extends Person {
public String universityName;
public Student(String name, int age, float height, String universityName) {
super(name, age, height);
this.universityName = universityName;
}
public void getInfo() {
super.getInfo();
System.out.println("University Name:"+this.universityName);
}
}
Ta thử khởi tạo để kiểm tra:
package KeThua;
public class MainClass {
public static void main(String[] args) {
Student a = new Student("Chau", 21, 1.7f, "UTE");
a.getInfo();
}
}
Flow của chương trình có thể hiểu như sau:
4. Ví dụ khác về tính kế thừa
Chúng ta hãy xem xét thêm 1 ví dụ khác về tính kế thừa để hiểu rõ hơn nhé.
Đầu tiên hãy tạo một lớp tên là Animal
.
class Animal {
void eat() {
System.out.println("I can eat.");
}
}
Tiếp theo hãy dẫn xuất một lớp tên là Dog
từ lớp này.
// parent class
class Animal {
void eat() {
System.out.println("I can eat.");
}
}
// the Dog class is derived from Animal
class Dog extends Animal {
void bark() {
System.out.println("I can bark.");
}
}
Ở đây, chúng ta đã sử dụng từ khóa extends
để kế thừa tất cả các trường và phương thức của lớp Animal
trong lớp Dog
.
Vậy điều này có ý nghĩa gì?
Các đối tượng của lớp Dog không chỉ có thể truy cập các phương thức và trường của lớp Dog mà còn có thể truy cập các phương thức và trường của lớp Animal.
Tiếp theo, chúng ta sẽ tạo các đối tượng của lớp Dog
và truy cập phương thức của Animal
.
//parent class
class Animal {
void eat() {
System.out.println("I can eat.");
}
}
//the Dog class is derived from Animal
class Dog extends Animal {
void bark() {
System.out.println("I can bark.");
}
}
class Main {
public static void main(String[] args) {
// object of the Dog class
Dog dog1 = new Dog();
// access the bark() method of Dog
dog1.bark();
// access the eat() method of Animal
dog1.eat();
}
}
Đầu ra
I can bark.
I can eat.
Ở đây, dog1
là đối tượng của lớp Dog
. Vì thế,
dog1.bark()
gọi phương thứcbark()
của lớpDog
.dog1.eat()
gọi phương thứceat()
của lớpAnimal
. Điều này hoàn toàn khả thi vìDog
được dẫn xuất từAnimal
nên lớpDog
kế thừa tất cả các phương thức và trường củaAnimal
.
Lưu ý: Đối tượng của Animal
chỉ có thể truy cập các phương thức và thuộc tính của Animal
. Đó là bởi vì Dog
được dẫn xuất từ Animal
chứ không phải ngược lại.
5. Kết
Như vậy chúng ta đã tìm hiểu xong tính kế thừa trong lập trình hướng đối tượng. Cảm ơn các bạn đã theo dõi bài viết của mình. Chúc các bạn thành công. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn: