20111012_Java-Ltrinhhuongdoituong-p3_11
Tính kế thừa trong Java cũng tương tự như mô hình trên!

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.
PHP:
class {
      
//...}
class 
extends A{
      
//...}
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)
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;
    }
}
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)
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!


[IMG]

Bài tập về nhà::D

Bài 1: Dùng tính kế thừa khai báo 3 class:
Class "Sinh Viên" gồm các thuộc tính: Họ tên, năm sinh, mã thẻ, tiền học phí còn nợ.
Class "Giảng Viên" gồm các thuộc tính: Họ tên, năm sinh, mã thẻ, tiền lương hàng tháng.
Class "Giám Đốc" gồm các thuộc tính: Họ tên, năm sinh, mã thẻ, tiền tiêu hàng tháng.

Các thuộc tính để private, truy cập các thuộc tính sử dụng phương thức getter và setter
Tạo 1 đối tượng giảng viên, giá trị nhập vào từ bàn phím, in thông tin ra ngoài
màn hình console

Đọc thêm: Tính kế thừa và tính trừu tượng trong Java

0 blogger-facebook:

Post a Comment

 
Top