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
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:
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!
- 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