/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

[Tự Học Java] MOB1014-Java 1 - Bài 7 - Ghi Đè/Overriding - P2/2

NỘI DUNG:
1. Overrding
2. Bài tập

THỰC HIỆN:
1. Overriding 
  • Khi lớp con và lớp cha có cùng phương thức và cùng cú pháp (phương thức có tên giống nhau và có cùng các tham số truyền vào) nên phương thức của lớp con sẽ ghi đè lên phương thức của lớp cha

  • Ghi đè phương thức được sử dụng để thu được tính đa hình tại thời điểm đang chạy/runtime
Ví dụ đa hình:
class Shape {
    void draw() {
        System.out.println("drawing...");
    }
}

class Circle extends Shape {
    void draw() {
        System.out.println("drawing circle...");
    }
}
 
class Triangle extends Shape {
    void draw() {
        System.out.println("drawing triangle...");
    }
}
class Rectangle extends Shape {
    void draw() {
        System.out.println("drawing rectangle...");
    }
}
class ViDu_DaHinh {
    public static void main(String args[]) {
        Shape s;
        s = new Circle();
        s.draw();
        s = new Triangle();
        s.draw();
        s = new Rectangle();
        s.draw();
    }
}


Các điểm cần chú ý:
- Lớp con ghi đè phương thức của lớp cha thì sẽ che dấu phương thức của lớp cha
- Mục đích của ghi đè là để sửa lại phương thức của lớp cha trong lớp con
- Sử dụng từ khóa super để truy cập đến phương thức đã bị ghi đè của lớp cha.
- Đặc tả truy xuất của phương thức lớp con phải có độ công khai bằng hoặc hơn đặc tả truy xuất của phương thức lớp cha.


Ví dụ:
- Yêu cầu tương tự phần Kế thừa/Inheritance  ở phần 1
- Bổ sung lớp LaoCong với cách tính lương là tùy theo số giờ làm việc.
- Thêm phương thức getThuNhap cho các lớp NhanVien
- Thực hiện ghi đè/overriding cho lớp TruongPhong, LaoCong sao cho phù hợp cách tính lương mỗi lớp tương ứng
- Viết chương trình để gán dữ liệu cho các lớp nói trên và hiển thị thông dữ liệu hiện tại của các lớp (tính đa hình của phương thức getThuNhap).

Gợi ý:
- Bổ sung lớp LaoCong với cách tính lương là tùy theo số giờ làm việc.
import java.util.Scanner;

public class LaoCong extends NhanVien{
    int soGioLamViec;

    // GETTER & SETTER
    public int getSoGioLamViec() {
        return soGioLamViec;
    }

    public void setSoGioLamViec(int soGioLamViec) {
        this.soGioLamViec = soGioLamViec;
    }

    // CONSTRUCTOR
    public LaoCong(int soGioLamViec, String tenNhanVien, double mucLuong) {
        super(tenNhanVien, mucLuong);
        this.soGioLamViec = soGioLamViec;
    }
}

- Thêm phương thức getThuNhap cho các lớp NhanVien
public double getThuNhap(){
        return mucLuong;
    }

- Thực hiện ghi đè/overriding cho lớp TruongPhong, LaoCong sao cho phù hợp cách tính lương mỗi lớp tương ứng

TruongPhong:
@Override
    public void hienThi(){
        super.hienThi(); // goi phuong thuc hien thi tu lop cha-NhanVien
        
        System.out.println("- Phu Cap Chuc Vu: " + phuCapChucVu);
    }
      
    @Override
    public void nhapDuLieu(){
        Scanner sc = new Scanner(System.in);
        super.nhapDuLieu(); 
        
        System.out.print("Phu Cap Chuc Vu:");
        phuCapChucVu = sc.nextDouble();
    }

    // phan 2
    @Override
    public double getThuNhap() {
        return super.getMucLuong() + getPhuCapChucVu();
    }

LaoCong:
// GHI DE
    @Override
    public void nhapDuLieu() {
        Scanner sc = new Scanner(System.in);
        System.out.print("Ho ten LC: ");
        tenNhanVien = sc.nextLine();
        System.out.print("So gio lam viec: ");
        soGioLamViec = sc.nextInt();
    }

    @Override
    public double getThuNhap() {
        return  getSoGioLamViec() * 50000;
    }

    @Override
    void hienThi() {
        System.out.println("- Ho Ten: " + getTenNhanVien());
        System.out.println("- Muc Luong: " + getThuNhap());
    }

Full Code tham khảo:

NhanVien
import java.util.Scanner;

public class NhanVien {
    public String tenNhanVien;
    protected  double mucLuong;

    // GETTER & SETTER
    public String getTenNhanVien() {
        return tenNhanVien;
    }

    public double getMucLuong() {
        return mucLuong;
    }

    public void setTenNhanVien(String tenNhanVien) {
        this.tenNhanVien = tenNhanVien;
    }

    public void setMucLuong(double mucLuong) {
        this.mucLuong = mucLuong;
    }

    // CONSTRUCTOR
    public NhanVien(String tenNhanVien, double mucLuong) {
        this.tenNhanVien = tenNhanVien;
        this.mucLuong = mucLuong;
    }
    
    // NHAP LIEU, PUBLIC
    public void nhapDuLieu(){
        Scanner sc = new Scanner(System.in);
        System.out.print("Ho ten: ");
        tenNhanVien = sc.nextLine();
        System.out.print("Luong: ");
        mucLuong = sc.nextDouble();
    }
    
    // IN/HIEN THI, MAC DINH
    void hienThi(){
        System.out.println("- Ho Ten: " + tenNhanVien);
        System.out.println("- Muc Luong: " + mucLuong);
    }
    
    // PRIVATE, lop con se khong duoc ke thua
    private double thueThuNhap(){
        if(mucLuong < 5000000){
            return 0;
        }else{
            return (mucLuong - 5000000)*10/100;
        }
    }
    
    // phan 2 - THU NHAP MAC DINH SE LA MUC LUONG
    public double getThuNhap(){
        return mucLuong;
    }
}

TruongPhong
import java.util.Scanner;

public class TruongPhong extends NhanVien{
    public double phuCapChucVu;

    // GETTER & SETTER
    public double getPhuCapChucVu() {
        return phuCapChucVu;
    }

    public void setPhuCapChucVu(double phuCapChucVu) {
        this.phuCapChucVu = phuCapChucVu;
    }

    // CO THE DUNG CONSTRUCTOR TU DONG DE TAO RA
    public TruongPhong( String tenNhanVien, double mucLuong, double phuCapChucVu) {
        super(tenNhanVien, mucLuong);
        this.phuCapChucVu = phuCapChucVu;
    }
    
    @Override
    public void hienThi(){
        super.hienThi(); // goi phuong thuc hien thi tu lop cha-NhanVien
        
        System.out.println("- Phu Cap Chuc Vu: " + phuCapChucVu);
    }
      
    @Override
    public void nhapDuLieu(){
        Scanner sc = new Scanner(System.in);
        super.nhapDuLieu(); 
        
        System.out.print("Phu Cap Chuc Vu:");
        phuCapChucVu = sc.nextDouble();
    }

    // phan 2
    @Override
    public double getThuNhap() {
        return super.getMucLuong() + getPhuCapChucVu();
    }
        
}

LaoCong
import java.util.Scanner;

public class LaoCong extends NhanVien{
    int soGioLamViec;

    // GETTER & SETTER
    public int getSoGioLamViec() {
        return soGioLamViec;
    }

    public void setSoGioLamViec(int soGioLamViec) {
        this.soGioLamViec = soGioLamViec;
    }

    // CONSTRUCTOR
    public LaoCong(int soGioLamViec, String tenNhanVien, double mucLuong) {
        super(tenNhanVien, mucLuong);
        this.soGioLamViec = soGioLamViec;
    }
    
    // GHI DE
    @Override
    public void nhapDuLieu() {
        Scanner sc = new Scanner(System.in);
        System.out.print("Ho ten LC: ");
        tenNhanVien = sc.nextLine();
        System.out.print("So gio lam viec: ");
        soGioLamViec = sc.nextInt();
    }

    @Override
    public double getThuNhap() {
        return  getSoGioLamViec() * 50000;
    }

    @Override
    void hienThi() {
        System.out.println("- Ho Ten: " + getTenNhanVien());
        System.out.println("- Muc Luong: " + getThuNhap());
    }
}

Main_DaHinh 
public class Main_DaHinh {
    public static void main(String[] args) {
          NhanVien nv1 = new NhanVien("Van Cong Khanh", 1500000);
          nv1.hienThi();    
          
          TruongPhong tp1 = new TruongPhong("Ten ong TRUONG PHONG", 2000000, 500000);
          tp1.hienThi();
          
          LaoCong lc1 = new LaoCong(50, "Tran Van Ku Teo", 50000);
          lc1.hienThi();
          
    }
}

2. Bài tập:

7.2.2.1
Tạo lớp SinhVienPoly gồm 2 thuộc tính họ tên và ngành cùng với phương thức trừu tượng là getDiem(). Thêm phương thức getHocLuc() để xếp loại học lực. Lớp cũng bao gồm một phương thức xuat() để xuất họ tên, ngành, điểm và học lực ra màn hình.

Hướng dẫn:
- Xây dựng lớp có mô hình
- Vì chưa biết sinh viên này học những môn nào nên chưa tính được điểm vì vậy phương thức getDiem() phải là phương thức trừu tượng
- Chú ý lớp SinhVienPoly phải là lớp trừu tượng vì có phương thức getDiem() là phương thức trừu tượng
- Phương thức getHocLuc() được viết bình thường vẫn sử dụng phương thức getDiem() để lấy điểm của sinh viên mặc dù hiện tại vẫn chưa biết điểm được tính thế nào. Học lực được tính như sau
o Yếu: điểm < 5
o Trung bình: 5 <= điểm < 6.5
o Khá: 6.5 <= điểm < 7.5
o Giỏi: 7.5 <= điểm < 9
o Xuất sắc: điểm >= 9



Xong!

No comments:

Post a Comment

/*header slide*/