Tính k? th?a trong Java c?ng t??ng t? nh? mô hình trên!
?
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: " + hsAvailable link for download