Friday, October 14, 2016

Bà i 16 Tính kế thừa inheritance trong Java

Bà i 16 Tính kế thừa inheritance trong Java


Bài 16: Tính k? th?a (inheritance) trong Java

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: " hsAvailable link for download