1. Overloading method/Nạp chồng phương thức
2. Constructor/Hàm xây dựng/Phương thức khởi tạo
3. Bài tập:
- Tạo class mới có tên SanPham.java với các thuộc tính: maSanPham, tenSanPham, donGia, giamGia (dùng phương thức getter và setter để đọc ghi thông tin cho sản phẩm)
- Xây dựng phương thức nhapThongTin (đọc dữ liệu nhập vào từ bàn phím) và xuatThongTin (in thông tin sản phẩm ra màn hình)
- Khởi tạo phương thức main với các yêu cầu:
- Tạo ra 2 sản phẩm mới là sp1 và sp2 từ class SanPham- Truy xuất và gọi phương thức nhapThongTin để nhập dữ liệu từ bàn phím- Truy xuất và gọi phương thức xuatThongTin để in thông tin của từng sản phẩm ra màn hình
- Xây dựng construtor cho class SanPham với các yêu cầu:
- Đầy đủ các tham số (maSanPham, tenSanPham, donGia, giamGia)- Chỉ 3 tham số truyền vào (maSanPham, tenSanPham, donGia) và ngầm hiểu KHÔNG giảm giá- Không tham số đầu vào với các giá trị mặc định là NULL cho các trường maSanPham, tenSanPham và KHÔNG cho các trường donGia, giamGia
- Viết chương trình tạo 2 sản phẩm có giảm giá (4 tham số đầu vào) và không giảm giá (3 tham số truyền vào) sau đó xuất thông tin 2 sản phẩm ra màn hình
- Nâng cấp lớp SanPham bằng cách khai báo các trường dữ liệu với đặc tả truy xuất là private để hạn chế truy xuất trực tiếp đến các trường này
THỰC HIỆN:
1. Overloading method/Nạp chồng phương thức:
Ví dụ 421:
Là các phương thức nằm cùng trong một class, được đặt tên giống nhau
nhưng khác tham số truyền vào (khác kiểu dữ liệu, khác số lượng tham
số).
Ví dụ 421:
Tạo class mới có tên SinhVien_421 với 4 phương thức có cùng 1 tên là
setMaSoSV dùng để thiết lập/gán mã số sinh viên (maSoSV) với các yêu
cầu:
- Gán maSoSV là "SV999" nếu phương thức đó không có tham số truyền vào
- Gán maSoSV là chuỗi truyền vào, nếu dữ liệu truyền vào là chuỗi
- Gán maSoSV là "SV" + số truyền vào, nếu dữ liệu truyền vào là số
- Gán maSoSV là chuỗi + số, nếu dữ liệu truyền với 2 tham số (tham số thứ nhất là chuỗi, tham số thứ 2 là số)
Code:
public class SinhVien_421 {
public String maSoSV;
// === GETTING ===
public String getMaSoSV() {
return maSoSV;
}
// === SETTING ===
public void setMaSoSV() {
this.maSoSV = "SV999";
}
public void setMaSoSV(String laChuoi) {
this.maSoSV = laChuoi;
}
public void setMaSoSV(int laSo) {
this.maSoSV = "SV" + laSo;
}
public void setMaSoSV(String laChuoi, int laSo) {
this.maSoSV = laChuoi + laSo;
}
}
Tạo class main có tên Main_SinhVien_421, tạo đối tượng sinh viên mới
trong class, truy cập và truyền dữ liệu cho các phương thức tương ứng,
truy xuất vào phương thức getting để in ra dữ liệu theo yêu cầu.
Code:
public class Main_SinhVien_421 {
public static void main(String[] args) {
SinhVien_421 svNapChong = new SinhVien_421();
svNapChong.setMaSoSV();
System.out.println("Ma so SV (KHONG THAM SO): " + svNapChong.getMaSoSV());
svNapChong.setMaSoSV("SV123");
System.out.println("Ma so SV (LA CHUOI): " + svNapChong.getMaSoSV());
svNapChong.setMaSoSV(456);
System.out.println("Ma so SV (LA SO): " + svNapChong.getMaSoSV());
svNapChong.setMaSoSV("SV", 789);
System.out.println("Ma so SV (LA CHUOI, va LA SO): " + svNapChong.getMaSoSV());
}
}
Kết quả:
run:Ma so SV (KHONG THAM SO): SV999Ma so SV (LA CHUOI): SV123Ma so SV (LA SO): SV456Ma so SV (LA CHUOI, va LA SO): SV789BUILD SUCCESSFUL (total time: 0 seconds)
2. Constructor/Hàm xây dựng/Phương thức khởi tạo
- Constructor là phương thức đặc biệt để tạo ra đối tượng/object, nó được gọi tự động và được gọi đầu tiên khi một object được khởi tạo
- Constructor phải có tên trùng với tên lớp/class
- Constructor không có giá trị trả về, có thể có hoặc không có tham số truyền vào
- Contructor có thể bị nạp chồng (overloading)
- Nếu một class chưa khai báo constructor thì sẽ được JAVA cung cấp một constructor mặc định (không tham số truyền vào)
Noted: Khi cần khởi
tạo giá trị mặc định cho đối tượng thì chúng ta dùng constructor
Ví dụ 422
- Khởi tạo class có tên SinhVien_422 với 3 biến (maSoSV, hoTen, namSinh) và xây dựng hàm/constructor:
- Gán giá trị mặc định cho các biến trên nếu chúng không có giá trị truyền vào
- Gán giá trị cho các biến là các giá trị của biến truyền vào
- Xây dựng phương thức hiển thị thông tin sinh viên
- Khởi tạo hàm main, tạo mới đối tượng và gọi phương thức hiện thị sinh viên
Code:
public class SinhVien_422 {
public String maSoSV;
public String hoTen;
public int namSinh;
// CONSTRUCTOR
// Gán giá trị mặc định cho các biến trên nếu chúng không có giá trị truyền vào
public SinhVien_422() {
this.maSoSV = "SV000";
this.hoTen = "Tony TEO";
this.namSinh = 2000;
}
//Gán giá trị cho các biến là các giá trị của biến truyền vào
public SinhVien_422(String maSoSV, String hoTen, int namSinh) {
this.maSoSV = maSoSV;
this.hoTen = hoTen;
this.namSinh = namSinh;
}
// hien thi/in thong tin sinh vien
public void inThongTinSV(){
System.out.println("Ma SV: " + this.getMaSoSV());
System.out.println("Ho ten: " + this.getHoTen());
System.out.println("Nam sinh: " + this.namSinh);
}
// GETTING
public String getMaSoSV() {
return maSoSV;
}
public String getHoTen() {
return hoTen;
}
public int getNamSinh() {
return namSinh;
}
// SETTING
public void setMaSoSV(String maSoSV) {
this.maSoSV = maSoSV;
}
public void setHoTen(String hoTen) {
this.hoTen = hoTen;
}
public void setNamSinh(int namSinh) {
this.namSinh = namSinh;
}
}
- Khởi tạo hàm main, tạo mới đối tượng và gọi phương thức hiện thị sinh viên
Code:
public class Main_SinhVien_422 {
public static void main(String[] args) {
SinhVien_422 sv4221 = new SinhVien_422();
sv4221.inThongTinSV();
System.out.println("==================");
SinhVien_422 sv4222 = new SinhVien_422("SV123", "Van Cong Khanh", 2222);
sv4222.inThongTinSV();
}
}
Kết quả:
run:Ma SV: SV000Ho ten: Tony TEONam sinh: 2000==================Ma SV: SV123Ho ten: Van Cong KhanhNam sinh: 2222BUILD SUCCESSFUL (total time: 0 seconds)
3. Bài Tập:
- Tạo class mới có tên SanPham.java với các thuộc tính: maSanPham, tenSanPham, donGia, giamGia (dùng phương thức getter và setter để đọc ghi thông tin cho sản phẩm)
- Xây dựng phương thức nhapThongTin (đọc dữ liệu nhập vào từ bàn phím) và xuatThongTin (in thông tin sản phẩm ra màn hình)
Code:
import java.util.Scanner;
public class SanPham {
public String maSanPham;
public String tenSanPham;
public double donGia;
public double giamGia;
/*
Tạo class mới có tên SanPham.java với các thuộc tính:
maSanPham, tenSanPham, donGia, giamGia
(dùng phương thức getter và setter để đọc ghi thông tin cho sản phẩm)
*/
// SETTER
public void setMaSanPham(String maSanPham) {
this.maSanPham = maSanPham;
}
public void setTenSanPham(String tenSanPham) {
this.tenSanPham = tenSanPham;
}
public void setDonGia(double donGia) {
this.donGia = donGia;
}
public void setGiamGia(double giamGia) {
this.giamGia = giamGia;
}
//GETTER
public String getMaSanPham() {
return maSanPham;
}
public String getTenSanPham() {
return tenSanPham;
}
public double getDonGia() {
return donGia;
}
public double getGiamGia() {
return giamGia;
}
/*
Xây dựng phương thức nhapThongTin (đọc dữ liệu nhập vào từ bàn phím),
và xuatThongTin (in thông tin sản phẩm ra màn hình)
*/
// NHAP THONG TIN CHO SAN PHAM
public void nhapThongTin(){
Scanner in = new Scanner(System.in);
System.out.print("Ma san pham: ");
maSanPham = in.nextLine();
System.out.print("Ten san pham: ");
tenSanPham = in.nextLine();
System.out.print("Gia san pham: ");
donGia = in.nextDouble();
System.out.print("Giam gia: ");
giamGia = in.nextDouble();
}
// IN THONG TIN SAN PHAM RA MAN HINH
public void xuatThongTin(){
System.out.println("Ma san pham: " + this.maSanPham);
System.out.println("Ten san pham: " + this.tenSanPham);
System.out.println("Gia san pham: " + this.donGia);
System.out.println("Giam gia: " + this.giamGia);
}
}
- Khởi tạo phương thức main với các yêu cầu:
- Tạo ra 2 sản phẩm mới là sp1 và sp2 từ class SanPham- Truy xuất và gọi phương thức nhapThongTin để nhập dữ liệu từ bàn phím- Truy xuất và gọi phương thức xuatThongTin để in thông tin của từng sản phẩm ra màn hình
Code:
public class Main_SanPham {
public static void main(String[] args) {
/*
Khởi tạo phương thức main với các yêu cầu:
- Tạo ra 2 sản phẩm mới là sp1 và sp2 từ class SanPham
- Truy xuất và gọi phương thức nhapThongTin để nhập dữ liệu từ bàn phím
- Truy xuất và gọi phương thức xuatThongTin để in thông tin của từng sản phẩm ra màn hình
*/
SanPham sp1 = new SanPham();
SanPham sp2 = new SanPham();
sp1.nhapThongTin();
sp2.nhapThongTin();
System.out.println("================");
sp1.xuatThongTin();
System.out.println();
sp2.xuatThongTin();
}
}
- Xây dựng phương thức getThueThuNhap là 10% giá sản phẩm với phạm vi truy cập chỉ trong class SanPham (gợi ý: dùng private), bổ sung thông tin của phương thức thuế thu nhập vào phương thức xuatThongTin
Code:
/*
Xây dựng phương thức getThueThuNhap với phạm vi truy cập chỉ trong class SanPham
*/
private double getThueThuNhap(){
return donGia*0.1;
}
public void xuatThongTin(){
System.out.println("Ma san pham: " + this.maSanPham);
System.out.println("Ten san pham: " + this.tenSanPham);
System.out.println("Gia san pham: " + this.donGia);
System.out.println("Giam gia: " + this.giamGia);
//bổ sung thông tin của phương thức thuế thu nhập vào phương thức xuatThongTin
System.out.println("Thue thu nhap: " + this.getThueThuNhap());
}
- Xây dựng construtor cho class SanPham với các yêu cầu:
- Đầy đủ các tham số (maSanPham, tenSanPham, donGia, giamGia)
- Chỉ 3 tham số truyền vào (maSanPham, tenSanPham, donGia) và ngầm hiểu KHÔNG giảm giá- Không tham số đầu vào với các giá trị mặc định là NULL cho các trường maSanPham, tenSanPham và KHÔNG cho các trường donGia, giamGia
Code:
// CONSTRUCTOR
/*
Xây dựng construtor cho class SanPham với các yêu cầu:
- Đầy đủ các tham số (maSanPham, tenSanPham, donGia, giamGia)
- Chỉ 3 tham số truyền vào (maSanPham, tenSanPham, donGia) và ngầm hiểu KHÔNG giảm giá
- Không tham số đầu vào với các giá trị mặc định là NULL cho các trường maSanPham, tenSanPham và KHÔNG cho các trường donGia, giamGia
*/
public SanPham(String maSanPham, String tenSanPham, double donGia, double giamGia) {
this.maSanPham = maSanPham;
this.tenSanPham = tenSanPham;
this.donGia = donGia;
this.giamGia = giamGia;
}
public SanPham(String maSanPham, String tenSanPham, double donGia) {
this.maSanPham = maSanPham;
this.tenSanPham = tenSanPham;
this.donGia = donGia;
this.giamGia = 0;
}
public SanPham() {
this.maSanPham = "";
this.tenSanPham = "";
this.donGia = 0;
this.giamGia = 0;
}
- Viết chương trình tạo 2 sản phẩm có giảm giá (4 tham số đầu vào) và không giảm giá (3 tham số truyền vào) sau đó xuất thông tin 2 sản phẩm ra màn hình
Code:
import java.util.Scanner;
public class Main_SanPham_Constructor {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String maSanPham, tenSanPham;
double donGia,giamGia;
System.out.print("Ma san pham: ");
maSanPham = in.nextLine();
System.out.print("Ten san pham: ");
tenSanPham = in.nextLine();
System.out.print("Gia san pham: ");
donGia = in.nextDouble();
System.out.print("Giam gia: ");
giamGia = in.nextDouble();
SanPham sp1 = new SanPham(tenSanPham, maSanPham, donGia, giamGia);
System.out.println("-----");
sp1.xuatThongTin();
/*
SAN PHAM 2
*/
in.nextLine();
System.out.println();
System.out.println("===============");
System.out.print("Ma san pham: ");
maSanPham = in.nextLine();
System.out.print("Ten san pham: ");
tenSanPham = in.nextLine();
System.out.print("Gia san pham: ");
donGia = in.nextDouble();
SanPham sp2 = new SanPham(tenSanPham, maSanPham, donGia);
System.out.println("-----");
sp2.xuatThongTin();
}
}
- Nâng cấp lớp SanPham bằng cách khai báo các trường dữ liệu với đặc tả truy xuất là private để hạn chế truy xuất trực tiếp đến các trường này
Chúng ta chỉ cần thay thế từ khóa
public thành từ khóa private cho các trường dữ liệu là được
Code:
private String maSanPham;
private String tenSanPham;
private double donGia;
private double giamGia;
FULL code của class SanPham
import java.util.Scanner;
public class SanPham {
private String maSanPham;
private String tenSanPham;
private double donGia;
private double giamGia;
/*
Tạo class mới có tên SanPham.java với các thuộc tính:
maSanPham, tenSanPham, donGia, giamGia
(dùng phương thức getter và setter để đọc ghi thông tin cho sản phẩm)
*/
// SETTER
public void setMaSanPham(String maSanPham) {
this.maSanPham = maSanPham;
}
public void setTenSanPham(String tenSanPham) {
this.tenSanPham = tenSanPham;
}
public void setDonGia(double donGia) {
this.donGia = donGia;
}
public void setGiamGia(double giamGia) {
this.giamGia = giamGia;
}
//GETTER
public String getMaSanPham() {
return maSanPham;
}
public String getTenSanPham() {
return tenSanPham;
}
public double getDonGia() {
return donGia;
}
public double getGiamGia() {
return giamGia;
}
/*
Xây dựng phương thức getThueThuNhap với phạm vi truy cập chỉ trong class SanPham
*/
private double getThueThuNhap(){
return donGia*0.1;
}
/*
Xây dựng phương thức nhapThongTin (đọc dữ liệu nhập vào từ bàn phím),
và xuatThongTin (in thông tin sản phẩm ra màn hình)
*/
// NHAP THONG TIN CHO SAN PHAM
public void nhapThongTin(){
Scanner in = new Scanner(System.in);
System.out.print("Ma san pham: ");
maSanPham = in.nextLine();
System.out.print("Ten san pham: ");
tenSanPham = in.nextLine();
System.out.print("Gia san pham: ");
donGia = in.nextDouble();
System.out.print("Giam gia: ");
giamGia = in.nextDouble();
}
// IN THONG TIN SAN PHAM RA MAN HINH
public void xuatThongTin(){
System.out.println("Ma san pham: " + this.maSanPham);
System.out.println("Ten san pham: " + this.tenSanPham);
System.out.println("Gia san pham: " + this.donGia);
System.out.println("Giam gia: " + this.giamGia);
//bổ sung thông tin của phương thức thuế thu nhập vào phương thức xuatThongTin
System.out.println("Thue thu nhap: " + this.getThueThuNhap());
}
// CONSTRUCTOR
/*
Xây dựng construtor cho class SanPham với các yêu cầu:
- Đầy đủ các tham số (maSanPham, tenSanPham, donGia, giamGia)
- Chỉ 3 tham số truyền vào (maSanPham, tenSanPham, donGia) và ngầm hiểu KHÔNG giảm giá
- Không tham số đầu vào với các giá trị mặc định là NULL cho các trường maSanPham, tenSanPham và KHÔNG cho các trường donGia, giamGia
*/
public SanPham(String maSanPham, String tenSanPham, double donGia, double giamGia) {
this.maSanPham = maSanPham;
this.tenSanPham = tenSanPham;
this.donGia = donGia;
this.giamGia = giamGia;
}
public SanPham(String maSanPham, String tenSanPham, double donGia) {
this.maSanPham = maSanPham;
this.tenSanPham = tenSanPham;
this.donGia = donGia;
this.giamGia = 0;
}
public SanPham() {
this.maSanPham = "";
this.tenSanPham = "";
this.donGia = 0;
this.giamGia = 0;
}
}
Xong!