- Đó là khi phương thức đã xuất hiện ở lớp cha và xuất hiện tiếp ở lớp con.
- Khi đối tượng thuộc lớp con gọi phương thức thì sẽ chọn lựa và chạy theo phương thức trong lớp con.
- Nếu lớp con không có phương thức đó thì mới lên kiếm ở lớp cha để chạy.
- Phương thức ghi đè có cùng tên, cùng tham số truyền vào, cùng kiểu giá trị trả về với phương thức ở lớp cha!
- Ghi đè là hình thức đa hình (polymorphism) trong quá trình thực thi (Runtime)
Ở bài trước, ta biết đến cách nạp chồng phương thức (Overloading method), nó cùng nằm trong 1 lớp. Còn ghi đè ở đây, là sau khi lớp con kế thừa lớp cha của nó, ta chỉnh lại 1 phương thức nào đó cần thiết, tức là ghi đè để đạt được theo ý muốn!
2, Ví dụ:
Ví dụ 1: Sự khác nhau giữa Override và Overload
Ví dụ 2:
- Lớp "tên người Việt" gồm 2 thuộc tính: "họ" và "tên" và phương thức hiển thị tên đầy đủ theo thứ tự họ + tên
- Lớp "tên người nước ngoài" kế thừa từ lớp "tên người Việt" , phương thức hiển thị tên đầy đủ lại theo thứ tự tên + họ
- Như vậy, sau khi kế thừa ta chỉ cần ghi đè lại phương thức hiển thị là xong!
Code:
PHP:
package javademoandroidvn;
class tenNguoiViet {
public String ten, ho;
public void show() {
System.out.println("Tên đầy đủ là: " + this.ho + " "+this.ten);
}
}
class tenNguoiNuocNgoai extends tenNguoiViet {
@Override
public void show() {
System.out.println("Full name: " + this.ten + " " + this.ho);
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
tenNguoiViet nguoiV = new tenNguoiViet();
nguoiV.ho = "Nguyen";
nguoiV.ten = "Hung";
nguoiV.show();
tenNguoiNuocNgoai nguoiNN = new tenNguoiNuocNgoai();
nguoiNN.ho = "Nguyen";
nguoiNN.ten = "Hung";
nguoiNN.show();
}
}
- Lớp HocSinh gồm các thuộc tính: hoTen, lop, toan, ly, hoa và phương thức điểm trung bình là trung bình cộng 3 môn
- Lớp HocSinhChuyenToan kế thừa từ phương thức HocSinh, nhưng khi tính điểm trung bình nhân đôi hệ số môn Toán rồi cộng tất cả, chia cho 4. Như vậy cần ghi đè phương thức điểm trung bình ở lớp HocSinhChuyenToan
Code:
PHP:
package javademoandroidvn;
class HocSinh {
private String hoTen;
private String lop;
private float toan, ly, hoa;
public String getHoTen() {
return hoTen;
}
public void setHoTen(String hoTen) {
this.hoTen = hoTen;
}
public String getLop() {
return lop;
}
public void setLop(String lop) {
this.lop = lop;
}
public float getToan() {
return toan;
}
public void setToan(float toan) {
this.toan = toan;
}
public float getLy() {
return ly;
}
public void setLy(float ly) {
this.ly = ly;
}
public float getHoa() {
return hoa;
}
public void setHoa(float hoa) {
this.hoa = hoa;
}
public float diemTrungBinh() {
return (float) (this.toan + this.ly + this.hoa) / 3;
}
}
class HocSinhChuyenToan extends HocSinh {
@Override
public float diemTrungBinh() {
return (float) (this.getHoa() + this.getLy() + this.getToan() * 2) / 4;
}
}
public class JavaDemoAndroidVn {
public static void main(String[] args) {
HocSinh a = new HocSinh();
a.setHoTen("Vu Van Tuong");
a.setLop("At7a");
a.setToan(10.0f);
a.setLy(9.0f);
a.setHoa(8.0f);
System.out.println("Diem trung binh cua hoc sinh a la: " + a.diemTrungBinh());
HocSinhChuyenToan b = new HocSinhChuyenToan();
b.setHoTen("Nguyen Van B");
b.setToan(9.0f);
b.setHoa(7.0f);
b.setLy(8.0f);
System.out.println("Diem trung binh cua hoc sinh chuyen Toan b la: " + b.diemTrungBinh());
}
}
Tham khảo thêm 2 video bên blog StudyAndShare:
Bài tập về nhà:
Bài 1:
- Class USB có các thuộc tính: mã hàng, giá, số lượng. Phương thức tổng tiền = giá * số lượng, phương thức show in ra toàn bộ thông tin đơn hàng mua USB
- Class Mouse kế thừa từ class USB, ghi đè 2 phương thức tổng tiền (do chuột được giảm giá 20%) và show in toàn bộ thông tin đơn hàng khi khách hàng mua chuột máy tính.
- Tạo mỗi lớp 1 đối tượng, nhập thông tin từ bàn phím, in thông tin đơn hàng ra màn hình!
- Code hướng đối tượng, các thuộc tính để private!
Đọc thêm: Nâng cấp đối tượng của bạn
Của mình làm thế này nhưng sao mình nhập dữ liệu từ bàn phím vào thì in ra mất dữ liệu nhưng trong khi nhập thẳng dữ liệu vào trong code thì in ra lại có bạn nhỉ, xem hộ mình với!
ReplyDeletepackage basic;
import java.util.Scanner;
public class bai181 {
public static void main(String[] args) {
NhapTTMH nh = new NhapTTMH();
nh.NhapTTUSB();
nh.NhapTTMS();
USB usb = new USB();
MOUSE ms = new MOUSE();
usb.Show();
usb.Tongtien();
ms.Show();
ms.Tongtien();
}
}
class USB {
private String mahang;
private float gia;
private int sl;
public void setMahang(String mahang) {
this.mahang = mahang;
}
public String getMahang() {
return mahang;
}
public void setGia(float gia) {
this.gia = gia;
}
public float getGia() {
return gia;
}
public void setSl(int sl) {
this.sl = sl;
}
public int getSl() {
return sl;
}
public void Show() {
System.out.println("Mã hàng: " + this.mahang);
System.out.println("Giá: " + this.gia);
System.out.println("Số lượng: " + this.sl);
}
public void Tongtien() {
System.out.println("Tổng tiền là: " + this.gia * this.sl);
}
}
class MOUSE extends USB {
public void Show() {
System.out.println("Mã hàng: " + this.getMahang());
System.out.println("Giá: " + this.getGia());
System.out.println("Số lượng: " + this.getSl());
}
public void Tongtien() {
System.out.println("Tổng tiền là: " + this.getGia() * this.getSl() * 20 / 100);
System.out.println("Chuột được giảm 20% giá tiền.");
}
}
class NhapTTMH {
Scanner dl = new Scanner(System.in);
USB usb = new USB();
MOUSE ms = new MOUSE();
public void NhapTTUSB() {
System.out.print("Nhập mã USB: ");
usb.setMahang(dl.next());
System.out.print("Nhập giá USB: ");
usb.setGia(dl.nextFloat());
System.out.print("Nhập số lượng USB: ");
usb.setSl(dl.nextInt());
}
public void NhapTTMS() {
System.out.print("Nhập mã MOUSE: ");
ms.setMahang(dl.next());
System.out.print("Nhập giá MOUSE: ");
ms.setGia(dl.nextFloat());
System.out.print("Nhập số lượng MOUSE: ");
ms.setSl(dl.nextInt());
}
}