1, Khái niệm:
Một lớp con (subclass) có thể kế thừa tất cả những vùng dữ liệu và phương thức của một lớp khác (siêu lớp - superclass).
Như vậy việc tạo một lớp mới từ một lớp đã biết sao cho các thành phần (fields và methods) của lớp cũ cũng sẽ thành các thành phần (fields và methods) của lớp mới. Khi đó ta gọi lớpmới là lớp dẫn xuất (derived class) từ lớp cũ (superclass).
Có thể lớp cũ cũng là lớp được dẫn xuất từ một lớp nào đấy, nhưng đối với lớp mới vừa tạo thì lớp cũ đó là một lớp siêu lớp trực tiếp (immediate supperclass).
Dùng từ khóa extends để chỉ lớp dẫn xuất.
Như trên class B đã kết thừa từ class A.
** Chú ý: Java cung cấp 3 tiền tố/từ khóa để hỗ trợ tính kế thừa của lớp:
- public: lớp có thể truy cập từ các gói, chương trình khác.
- final: Lớp hằng, lớp không thể tạo dẫn xuất (không thể có con), hay đôi khi người ta gọi là lớp “vô sinh”.
- abstract: Lớp trừu tượng (không có khai báo các thành
phần và các phương thức trong lớp trừu tượng). Lớp dẫn xuất sẽ khai báo, cài đặt cụ thể các thuộc tính, phương thức của lớp trừu tượng.
(Những điều này ta sẽ bàn đến ở những bài sau)
2, Ví dụ:
Tạo 3 class gồm các thuộc tính tương ứng:
Class "nhân sự" gồm: họ tên, năm sinh, quê quán.
Class "học sinh" gồm: họ tên, năm sinh, quê quán, điểm trung bình.
Class "giáo viên" gồm: họ tên, năm sinh, quê quán, lương hàng tháng.
Như vậy, nếu như chúng ta không sử dụng tính kế thừa thì sẽ xảy ra tình trạng lặp code, nghĩa là khi khai báo 2 lớp "học sinh" và "giáo viên" sẽ khai báo lại các thuộc tính họ tên, năm sinh, quê quán
Để sử dụng tính kế thừa, ta chỉ cần khai báo lớp "nhân sự", sau đó 2 lớp còn lại ta kế thừa từ lớp "nhân sự" , thiếu thuộc tính, phương thức nào thì sẽ bổ sung vào lớp đó.
Xem bài làm dưới đây:
a, Tạo các thuộc tính để public, và kế thừa: (Để thuộc tính public như này cho ngắn gọn, các bạn dễ hiểu trước)
b, Tạo các thuộc tính để private, các phương thức cũng sẽ được kế thừa:
(Cụ thể là các phương thức getter và setter ở ví dụ này)
Một lớp con (subclass) có thể kế thừa tất cả những vùng dữ liệu và phương thức của một lớp khác (siêu lớp - superclass).
Như vậy việc tạo một lớp mới từ một lớp đã biết sao cho các thành phần (fields và methods) của lớp cũ cũng sẽ thành các thành phần (fields và methods) của lớp mới. Khi đó ta gọi lớpmới là lớp dẫn xuất (derived class) từ lớp cũ (superclass).
Có thể lớp cũ cũng là lớp được dẫn xuất từ một lớp nào đấy, nhưng đối với lớp mới vừa tạo thì lớp cũ đó là một lớp siêu lớp trực tiếp (immediate supperclass).
Dùng từ khóa extends để chỉ lớp dẫn xuất.
PHP:
class A {
//...}
class B extends A{
//...}
** Chú ý: Java cung cấp 3 tiền tố/từ khóa để hỗ trợ tính kế thừa của lớp:
- public: lớp có thể truy cập từ các gói, chương trình khác.
- final: Lớp hằng, lớp không thể tạo dẫn xuất (không thể có con), hay đôi khi người ta gọi là lớp “vô sinh”.
- abstract: Lớp trừu tượng (không có khai báo các thành
phần và các phương thức trong lớp trừu tượng). Lớp dẫn xuất sẽ khai báo, cài đặt cụ thể các thuộc tính, phương thức của lớp trừu tượng.
(Những điều này ta sẽ bàn đến ở những bài sau)
2, Ví dụ:
Tạo 3 class gồm các thuộc tính tương ứng:
Class "nhân sự" gồm: họ tên, năm sinh, quê quán.
Class "học sinh" gồm: họ tên, năm sinh, quê quán, điểm trung bình.
Class "giáo viên" gồm: họ tên, năm sinh, quê quán, lương hàng tháng.
Như vậy, nếu như chúng ta không sử dụng tính kế thừa thì sẽ xảy ra tình trạng lặp code, nghĩa là khi khai báo 2 lớp "học sinh" và "giáo viên" sẽ khai báo lại các thuộc tính họ tên, năm sinh, quê quán
Để sử dụng tính kế thừa, ta chỉ cần khai báo lớp "nhân sự", sau đó 2 lớp còn lại ta kế thừa từ lớp "nhân sự" , thiếu thuộc tính, phương thức nào thì sẽ bổ sung vào lớp đó.
Xem bài làm dưới đây:
a, Tạo các thuộc tính để public, và kế thừa: (Để thuộc tính public như này cho ngắn gọn, các bạn dễ hiểu trước)
PHP:
package javademoandroidvn;
class NhanSu {
public String hoTen;
public int namSinh;
public String queQuan;
}
class HocSinh extends NhanSu{
public float diemTb;
}
class GiaoVien extends NhanSu{
public int luong;
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
NhanSu ns = new NhanSu();
ns.hoTen = "Nhân Sự A";
ns.namSinh = 1990;
ns.queQuan = "Hải Dương";
HocSinh hs = new HocSinh();
hs.hoTen = "Vũ Văn A"; // Đối tượng tạo ra từ lớp "học sinh" kế thừa, sử dụng các thuộc tính của lớp "nhân sự"
hs.namSinh = 1992;
hs.queQuan = "Hải Dương";
hs.diemTb = 9.5f;
GiaoVien gv = new GiaoVien();
gv.hoTen = "Nguyễn Văn B"; // Đối tượng tạo ra từ lớp "giáo viên" kế thừa, sử dụng các thuộc tính của lớp "nhân sự"
gv.namSinh = 1980;
gv.queQuan = "Hà Nội";
gv.luong = 300000000;
}
}
(Cụ thể là các phương thức getter và setter ở ví dụ này)
PHP:
package javademoandroidvn;
class NhanSu {
private int namSinh;
private String queQuan;
private String hoTen;
public String getHoTen() {
return hoTen;
}
public void setHoTen(String hoTen) {
this.hoTen = hoTen;
}
public int getNamSinh() {
return namSinh;
}
public void setNamSinh(int namSinh) {
this.namSinh = namSinh;
}
public String getQueQuan() {
return queQuan;
}
public void setQueQuan(String queQuan) {
this.queQuan = queQuan;
}
}
class HocSinh extends NhanSu {
private float diemTb;
public float getDiemTb() {
return diemTb;
}
public void setDiemTb(float diemTb) {
this.diemTb = diemTb;
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
NhanSu ns = new NhanSu();
ns.setHoTen("Nhân Sự A");
ns.setNamSinh(1990);
ns.setQueQuan("Hải Dương");
HocSinh hs = new HocSinh();
hs.setHoTen("Vũ Văn A"); // Đối tượng tạo ra từ lớp "học sinh" kế thừa, sử dụng các thuộc tính, phương thức của lớp "nhân sự"
hs.setNamSinh(1992);
hs.setQueQuan("Hải Dương");
hs.setDiemTb(9.5f);
System.out.println("Thông tin học học sinh: ");
System.out.println("Họ tên: " + hs.getHoTen());
System.out.println("Năm sinh: " + hs.getNamSinh());
System.out.println("Quê quán: " + hs.getQueQuan());
System.out.println("Điểm trung bình: " + hs.getDiemTb());
}
}
Tham khảo thêm video bên blog StudyAndShare, có thể có 1 vài khái niệm bạn sẽ chưa hiểu, sau vài bài nữa, bạn nên xem lại video này!
Nguồn : Android.vn
0 nhận xét:
Post a Comment