/*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===*/
Showing posts with label java1. Show all posts
Showing posts with label java1. Show all posts

[Tự Học Java] MOB1014-Java 1 - Bài 8 - Lớp & Phương Thức Nâng Cao

MỤC TIÊU

Kết thúc bài thực hành này bạn có khả năng sử dụng phương thức tĩnh để xây dựng một thư viện các hàm tiện ích phục vụ cho các thao tác xử lý nhanh sau này.

LÝ THUYẾT

1. Phương Thức Tham Số Biến Đổi

Với các viết cũ, ví dụ có các phương thức tính tổng của 2, 3, 4,... 
    public static int tinhTong(int a, int b){ // tổng 2 số
        return a + b;
    }
    public static int tinhTong(int a, int b, int c){ // tổng 3 số
        return a + b + c;
    }
    public static int tinhTong(int a, int b, int c, int d){ // tổng 4 số
        return a + b + c + d;
    }

Với code trên khi cần tính tổng của 5 số thì sẽ bị lỗi vì hàm tính tổng 5 số chưa được định nghĩa
Vì vậy có các viết khác tương đương với cách viết trên nhưng tham số truyền vào linh động hay có thể biến đổi

    public static final int tinhTong(int ...x){
        int tong = 0;
        for (int i = 0; i < x.length; i++){
            tong += x[i];
        }
        return tong;
    }

Hoặc cách viết khác
    public static final int tinhTong(int ...x){
        int tong = 0;
        for (int i: x){
            tong += i;
        }
        return tong;
    }

Ví dụ đầy đủ:
package Bai8;

/**
 *
 * @author khanhvc
 */
public class PhuongThuc {
    /*
    public static int tinhTong(int a, int b){
        return a + b;
    }
    
    public static int tinhTong(int a, int b, int c){
        return a + b + c;
    }
    
    public static int tinhTong(int a, int b, int c, int d){
        return a + b + c + d;
    }
    
    public static final int tinhTong(int ...x){
        int tong = 0;
        for (int i = 0; i < x.length; i++){
            tong += x[i];
        }
        return tong;
    }
    */
    public static final int tinhTong(int ...x){
        int tong = 0;
        for (int i: x){
            tong += i;
        }
        return tong;
    }
    
    public static void main(String[] args) {
        int tong2 = tinhTong(1, 2);
        System.out.println("Tong " + tong2);
        
        int tong3 = tinhTong(1, 2, 3);
        System.out.println("Tong " + tong3);
        
        int tong5 = tinhTong(1, 2, 3, 4, 5);
        System.out.println("Tong " + tong5);
        
        int mang[] = {1, 2, 3, 4, 5}; 
        int tongMang = tinhTong(mang); // có thể truyền vào 1 mảng 
        System.out.println("Tong mang: " + tongMang);
    }    
}

YÊU CẦU:
Tạo lớp final có tên là XPoly và bổ sung các phương thức tĩnh và viết mã theo yêu cầu của các bài sau đây.

Bài 1:
Thêm một phương thức tĩnh có tên là sum() với tham số biến đổi kiểu double. Viết mã cho phương thức này để thực hiện tính tổng các tham số truyền vào.

Bài 2:
Bổ sung thêm 2 phương thức tĩnh để tìm số lớn nhất và nhỏ nhất từ tham số biến đổi

Bài 3:
Bổ sung thêm 1 phương thức tĩnh toUpperFirstChar(String s) để chuyển đổi các ký tự đầu tiên của mỗi từ sang ký tự hoa. Ví dụ: “nguyen van teo” sẽ đổi thành “Nguyen Van Teo”.

Bài 4:
Viết chương trình sử dụng các phương thức tiện ích đã xây dựng trong lớp XPoly ở trên.

THỰC HIỆN:

Tạo lớp final có tên là XPoly (nội dung lớp gồm bài 1, 2, 3) và bổ sung các phương thức tĩnh và viết mã theo yêu cầu của các bài sau đây. 
Thêm một phương thức tĩnh có tên là sum() với tham số biến đổi kiểu double. Viết mã cho phương thức này để thực hiện tính tổng các tham số truyền vào.
    public static final double tinhTong(double ...thamSo){
        double tong = 0;
        for (double x: thamSo){
            tong += x;
        }
        return tong;
    }
Bổ sung thêm 2 phương thức tĩnh để tìm số lớn nhất và nhỏ nhất từ tham số biến đổi
    public static final double timMax(double ...thamSo){ // tìm số lớn nhất
        double max = thamSo[0];
        for (double x: thamSo){
            if ( x > max) 
                max = x;
        }
        return max;
    }
    // bai 2
    public static final double timMin(double ...thamSo){ // tìm số nhỏ nhất
        double min = thamSo[0];
        for (double x: thamSo){
            if ( x < min) 
                min = x;
        }
        return min;
    }
Bổ sung thêm 1 phương thức tĩnh toUpperFirstChar(String s) để chuyển đổi các ký tự đầu tiên của mỗi từ sang ký tự hoa. Ví dụ: “nguyen van teo” sẽ đổi thành “Nguyen Van Teo”.
    public static String ghiHoaKyTuDau(String motTu){ // Ghi hoa ký tự đầu tiên của một chuỗi
        return motTu.substring(0, 1).toUpperCase() + motTu.substring(1).toLowerCase();
    }
    
    public static String ghiHoaKyTuDauTienMoiTu(String chuoi){
        String chuoiMoi="";
        String [] mangMotTu = chuoi.split(" ");
        for (String motTu: mangMotTu ){
//            chuoiMoi += ghiHoaKyTuDau(motTu) + " "; // nối chuỗi theo cách thông thường
            chuoiMoi += ghiHoaKyTuDau(motTu).concat(" "); // nối chuỗi theo kiểu sử dụng hàm concat
        }
        return chuoiMoi;
    }
Viết chương trình sử dụng các phương thức tiện ích đã xây dựng trong lớp XPoly ở trên.
package Bai_8;

/**
 *
 * @author khanhvc
 */
public class Bai_8 {
    public static void main(String[] args) {
        
        System.out.println("Tong " + XPoly.tinhTong(1, 2, 3, 4, 5));
        System.out.println("Min " + XPoly.timMin(1, 2, 3, 4, 5));
        System.out.println("Max " + XPoly.timMax(1, 2, 3, 4, 5));
        System.out.println("Ghi hoa chu cai dau: " + XPoly.ghiHoaKyTuDauTienMoiTu("tOny tEO teO TEO"));
    }



Xong!

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

[Tự Học Java] MOB1014-Java 1 - Bài 7 - Kế Thừa/Inheritance - P1/2

NỘI DUNG:
1. Kế thừa trong OOP Java: 
2. Bài Tập

THỰC HIỆN:

1. Kế thừa trong OOP Java: 
  • Tính kế thừa thể hiện một lớp con có thể thừa kế các thuộc tính và phương thức của lớp cha
  • Tuy nhiên chỉ truy cập các thành viên publicprotected của lớp cha
  • Truy cập mặc định {default} (không khai báo từ khóa phia trước) của lớp cha nếu lớp con và lớp cha được định nghĩa cùng gói (package)
  • KHÔNG được phép truy cập đến thành viên private của lớp cha
  • Lớp con KHÔNG kế thừa các hàm tạo (constructor) của lớp cha

Sử dụng từ khóa:
  • extends để kế thừa
Cú pháp trong Java:
public class TenLopCon extends TenLopCha{
    // Khai bao..
    // ...
}



  • super để truy cập đến các thành viên của lớp cha. Ví dụsuper(tenNhanVien, mucLuong);
  • super để truy cập đến các constructor của lớp cha. Ví dụsuper.hienThi();

Ví dụ cụ thể:
  • Tạo một lớp/class có tên NhanVien với các yêu cầu:
- Các trường/thuộc tính: tenNhanVien, mucLuong
- Thiết lập phương thức getter, setter;
- Khởi tạo constructor
- Khởi tạo hàm public nhapDuLieu , hienThi (mặc định, không khai báo gì), private thueThuNhap
Code:
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;
        }
    }
}
  • Tạo TruongPhong kế thừa từ lớp NhanVien:
- Các thuộc tính hiện có của lớp NhanVien và thêm phương thức phuCapChucVu
- Khởi tạo constructor cho lớp TruongPhong (kế thừa tenNhanVien, mucLuong)
- Khởi tạo phương thức hienThi, nhapDuLieu (kế thừa từ lớp NhanVien và bổ sung thuộc tính phuCapChucVu sao cho thích hợp với từng hàm)
Code:
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();
    }
}
  • Từ hàm main truy cập vào class/lớp để tạo mới, nhập liệu và hiển thị thông tin trưởng phòng vừa nhập
Code:
public class Main {
    public static void main(String[] args) {
        TruongPhong tp1 = new TruongPhong("Tony Teo", 1200, 300);
        tp1.hienThi();
        
        tp1.nhapDuLieu();
        tp1.hienThi();
    }
}

2. Bài Tập

7.1.2.1
  • Xây dựng lớp ChuNhat gồm 2 thuộc tính là chieuRong và chieuDai và các phương thức getChuVi() và getDienTich() để tính chu vi và diện tích. Phương thức hienThi() sẽ xuất ra màn hình chiều rộng, chiều dài, diện tích và chu vi.
  • Xây dựng lớp HinhVuong kế thừa từ lớp ChuNhat và ghi đè phương thức hienThi() để xuất thông tin cạnh, diện tích và chu vi.
  • Viết chương trình nhập 2 hình chữ nhật và một hình vuông sau đó xuất ra màn hình.

Hướng dẫn:
Lớp ChuNhat
public class ChuNhat {
    public int chieuDai;
    public int chieuRong;

    // SETTER & GETTER
    public int getChieuDai() {
        return chieuDai;
    }

    public int getChieuRong() {
        return chieuRong;
    }

    public void setChieuDai(int chieuDai) {
        this.chieuDai = chieuDai;
    }

    public void setChieuRong(int chieuRong) {
        this.chieuRong = chieuRong;
    }

    // CONSTRUCTOR
    public ChuNhat() {
    }
    
    public ChuNhat(int chieuDai, int chieuRong) {
        this.chieuDai = chieuDai;
        this.chieuRong = chieuRong;
    }
    
    
    // XAY DUNG PHUONG THUC
    public int getDienTich(){
        return getChieuDai() * getChieuRong();
    }
    
    public int getChuVi(){
        return (getChieuDai() + getChieuRong())* 2;
    }
      
    public void hienThi(){
        System.out.printf("Chieu dai\t: %d%n", getChieuDai());
        System.out.printf("Chieu rong\t: %d%n", getChieuRong());
        System.out.printf("Chu vi\t\t: %d%n", getChuVi());
        System.out.printf("Dien tich\t: %d%n", getDienTich());
    }
}

Lớp HinhVuong (nhớ getter và setter cho biến canh ở lớp kế thừa nhé!)
public class HinhVuong extends ChuNhat{
    private int canh;

    // GETTER & SETTER
    public int getCanh() {
        return canh;
    }

    public void setCanh(int canh) {
        this.canh = canh;
    }
    
    // CONSTRUCTOR
    public HinhVuong() {
    }

    public HinhVuong(int canh) {
        super(canh, canh);
        this.canh = canh;
    }

    @Override
    public void hienThi() {
        System.out.printf("Canh\t\t: %d%n", getCanh());
        System.out.printf("Chu vi\t\t: %d%n", getChuVi());
        System.out.printf("Dien tich\t: %d%n", getDienTich());
    }
    
}

Hàm main
public class Main_7121 {
    public static void main(String[] args) {
        ChuNhat cn1 = new ChuNhat(5, 3);
        cn1.hienThi();
        
        HinhVuong hv1 = new HinhVuong(7);
        hv1.hienThi();
    }
}

Xong!

[Tự Học Java] MOB1014-Java 1 - Bài 6 - String/Chuỗi & Regular Expression

NỘI DUNG:
1. Chuỗi
  • Chuỗi là gì
  • Các phương thức trong String
  • Các ký hiệu đặc biệt
2. Regular Expression/Biểu thức chính quy
  • Regular Expression là gì
  • Các ví dụ

THỰC HIỆN:

1. Chuỗi là gì
Chuỗi là tập hợp các ký tự sử dụng để lưu trữ văn bản, trong Java khi biểu diễn chúng được bao bọc bỡi cặp dấu nháy kép "", (ký tự/char thì được bao bởi cặp dấu nháy đơn, ví dụ: 'C').

Ví dụ:
String str = "Hello"; // khởi tạo biến str có kiểu dữ liệu là string và gán giá trị là chuỗi Hello

  • Các phương thức trong String:
Phương Thức Giải Thích
length() Tính độ dài của chuỗi
toUpperCase() Chuyển chuỗi về kiễu chữ IN HOA
toLowerCase() Chuyển chuỗi về kiễu chữ thường
trim() Cắt bỏ các khoảng trắng đầu và cuối của chuỗi
substring(beginIndex, endIndex) Lấy ra một chuỗi con trong chuỗi khác, từ vị trí beginIndex đến vị trí thứ endIdex trừ 1.
charAt (index) Lấy ký tại vị trí thứ
replaceAll(find, replace) Tìm kiếm và thay thế tất cả
split(separator) Tách chuỗi ban đầu thành mãng chuỗi
equals() So sánh bằng có phân biệt hoa/thường
equalsIgnoreCase() So sánh bằng không phân biệt hoa/thường
contains() Kiểm tra có chứa hay không
startsWith() Kiểm tra có bắt đầu bởi hay không
endsWith () Kiểm tra có kết thúc bởi hay không
matches () So khớp với hay không
indexOf() Tìm vị trí xuất hiện đầu tiên của chuỗi con
lastIndexOf() Tìm vị trí xuất hiện cuối cùng của chuỗi con
concat() Nối chuỗi


Ví dụ:

public class Vidu_6_1_String {
    public static void main(String[] args) {
        String chuoiBanDau = "     TOI TEN LA, VAN cOnG Khanh      ";
        String chuThuong = chuoiBanDau.toLowerCase(); // chuyển chữ thường
        String boKhoangTrangDauCuoi = chuThuong.trim(); // bỏ khoảng trắng 2 đầu
        String thayDauHaiCham = boKhoangTrangDauCuoi.replace(",", ":"); // thay thế dấu phẩy thành dấu 2 chấm
        String thayKyTuDauTien = thayDauHaiCham.replaceFirst("t", "T"); // thay ký tự t đầu tiên thành chữ T
        
        String[] tachChuoiThanhNhieuCum = thayKyTuDauTien.split(":"); // tách chuỗi ban đầu thành mãng, căn cứ vào dấu hai chấm
        int chieuDaiCuaMang = tachChuoiThanhNhieuCum.length; // tính chiều dài của chuỗi
        
        String hoVaTen = tachChuoiThanhNhieuCum[chieuDaiCuaMang-1]; // truy xuất vào cụm cuối cùng của mãng
        String tenInHoa = hoVaTen.toUpperCase(); // ghi IN HOA toàn chuỗi
        String noiChuoi = tachChuoiThanhNhieuCum[0].concat(": ") + tenInHoa; // nối chuỗi dùng cách cộng chuỗi thông thường và dùng hàm concat
        System.out.println(noiChuoi);
       
    }
}

  • Các ký tự đặc biệt
Có một số trường hợp chúng ta muốn xuất ra chuỗi có dấu nháy đơn/kép hay các dấu xẹt. Java sẽ hiểu sai. Hướng giải quyết là chúng ta THÊM dấu xẹt ngược (xẹt dấu huyền) trước ký tự cần xuất ra thì một ký tự sau dấu xẹt đó Java hiểu đó là một ký tự bình thường.

Các ký tự phổ biến thường dùng
Ký tự Giải Thích Kết Quả
\' Dấu nháy đơn '
\" Dấu nháy kép "
\\ Dấu xẹt ngược (xẹt dấu huyền) \
\t Ký tự Tab Tab
\r Về đầu dòng/chuyển con trỏ chuột về đầu dòng
\n Xuống dòng/Dòng mới
\b Xóa 1 ký tự trước dấu xẹt ngược (tương đương phím Backspace) Backspace


2. Regular Expression/Biểu thức chính quy
Regular Expression hay regex còn gọi là biểu thức chính quy được dùng để tìm kiếm xử lý chuỗi nâng cao thông qua biểu thức được xây dựng theo những nguyên tắc riêng của nó mà bắc buộc chúng ta phải tuân theo. Khi gặp các yêu cầu kiểm tra tính hợp lệ của email, số điện thoại, địa chỉ IP thì điều bạn nghĩ tới đầu tiên chính là regex.

Sử dụng string.matches() để kiểm tra.
chuoi.matches(dinh_dang_muon_kiem_tra)

Ví dụ 2.1:
Viết chương trình yêu cầu nhập vào số điện thoại di động (di động của Việt Nam là dãy số co1 10 chữ số, số đầu tiền là số 0, và 9 số còn lại là số bất kỳ) nếu không đúng định dạng yêu cầu nhập lại, nếu đúng in ra số vừa nhập

Code:
import java.util.Scanner;
public class regSoDiDong {
	public static void main(String[] args) {
        String chuoi;
        String dinhDangSoDiDong = "[0][0-9]{9}";// định dạng của số di động Việt nam
        Scanner duLieuNhap = new Scanner(System.in);
        do {
            System.out.print("Nhap vao so Di Dong: ");
            chuoi = duLieuNhap.nextLine();
        } while (!chuoi.matches(dinhDangSoDiDong)) ;     
        
        System.out.println(chuoi);
    }
}

Ví dụ 2.2:
Viết chương trình nhập và mã số sinh viên, nếu không đúng ghi ra thông báo gợi ý định dạng của mã số sinh viên và yêu cầu nhập lại, đếu đúng chuyển thành chữ IN HOA (các ký tự không phải là số) in ra mà hình.

Code:
import java.util.Scanner;
public class regMaSoSinhVien {
	public static void main(String[] args) {
        String chuoi;
//        String dinhDangMSSV = "[\\w]{2}[0-9]{5}"; // ví dụ MSSV 2 ký tự đầu là chữ cái, 5 ký tự tiếp theo là số
        String dinhDangMSSV = "[\\w]{2}[\\d]{5}";
        Scanner duLieuNhap = new Scanner(System.in);
        
        while (true){
            System.out.print("Nhap vao ma so SV: ");
            chuoi = duLieuNhap.nextLine();
            if (chuoi.matches(dinhDangMSSV)){
                break;
            } else {
                System.out.println("Ma so SV co dang 'PS12345' !");    
            }
        }
        System.out.println(chuoi.toUpperCase());
    }
}

Ví dụ 2.3:
Viết chương trình nhập số CCCD (căn cước công dân) nếu không đúng yêu cầu nhập lại, và in ra giới tính và năm sinh của công dân có số CCCD vừa nhập. 

Ý nghĩa 12 số trong CCCD:
- 03 chữ số đầu tiên là mã tỉnh, thành phố trực thuộc trung ương hoặc mã quốc gia nơi công dân đăng ký khai sinh,
- 01 chữ số tiếp theo là mã giới tính của công dân
- 02 chữ số tiếp theo là mã năm sinh của công dân;
- 06 chữ số cuối là khoảng số ngẫu nhiên.



- Mã thế kỷ và mã giới tính được quy ước như sau:
+ Thế kỷ 20 (từ năm 1900 đến hết năm 1999): Nam 0, nữ 1;
+ Thế kỷ 21 (từ năm 2000 đến hết năm 2099): Nam 2, nữ 3;
+ Thế kỷ 22 (từ năm 2100 đến hết năm 2199): Nam 4, nữ 5;
+ Thế kỷ 23 (từ năm 2200 đến hết năm 2299): Nam 6, nữ 7;
+ Thế kỷ 24 (từ năm 2300 đến hết năm 2399): Nam 8, nữ 9.
- Mã năm sinh: Thể hiện hai số cuối năm sinh của công dân
...

Code:
import java.util.Scanner;
public class regMaSoSinhVien {
	public static void main(String[] args) {
        String chuoi;
        String dinhDangCCCD = "\\d{12}";
        
        char gioiTinh_4; // dùng để chứa ký thứ 4 trong chuỗi
        String namSinh_56; // lấy vị trí thứ 5 và 6
        
        String gioiTinh;
        int namSinh_2SoDau;
        
        Scanner duLieuNhap = new Scanner(System.in);
        
        while (true){
            System.out.print("Nhap vao so CCCD: ");
            chuoi = duLieuNhap.nextLine();
            if (chuoi.matches(dinhDangCCCD)){
                break;
            } else {
                System.out.println("Can cuoc cong dan co 12 chu so!");    
            }
                       
        } 
        gioiTinh_4 = chuoi.charAt(3);
       
        switch (gioiTinh_4){
            case '0':
                gioiTinh = "Nam";
                namSinh_2SoDau = 19;
                break;
            case '2':
                gioiTinh = "Nam";
                namSinh_2SoDau = 20;
                break;
            case '4':
                gioiTinh = "Nam";
                namSinh_2SoDau = 21;
                break;
            case '6':
                gioiTinh = "Nam";
                namSinh_2SoDau = 22;
                break;
            case '8':
                gioiTinh = "Nam";
                namSinh_2SoDau = 23;
                break;
            case '1':
                gioiTinh = "Nu";
                namSinh_2SoDau = 19;
            case '3':
                gioiTinh = "Nu";
                namSinh_2SoDau = 20;
            case '5':
                gioiTinh = "Nu";
                namSinh_2SoDau = 21;
            case '7':
                gioiTinh = "Nu";
                namSinh_2SoDau = 22;
            case '9':
                gioiTinh = "Nu";
                namSinh_2SoDau = 23;
                break;
            default:
                gioiTinh = "CHUA XAC DINH!";
                namSinh_2SoDau = 99;
                
        }
        namSinh_56 = chuoi.substring(4, 6);
        
        System.out.printf("Ban la %s, sinh nam %d%s%n", gioiTinh, namSinh_2SoDau, namSinh_56);
    
    }    
}

P/s: Các bạn có thể viết cách khác code gọn hơn nhiều

Tham khảo các quy tắc viết Regular Expression  tại đây




Xong!

[Tự Học Java] MOB1014-Java 1 - Bài 5 - ArrayList Thao Tác Nâng Cao - Collections P2/2

NỘI DUNG:
1. Thao tác tập hợp
2. Thao tác ArrayList nâng cao - Collections
3. Bài tập



THỰC HIỆN
1. Thao tác tập hợp

 

Phương Thức Mô Tả Ví Dụ Giải Thích
addAll(Collection) Phương thức được sử dụng để thêm tập hợp các phần tử vào danh sách mảng (hay cộng 2 danh sách mảng) Danh sách mảng a1 có các phần tử [3, 4]; a5 có các phần tử [4, 5]; a1.addAll(a2) Tạm hiểu là lấy danh sách mảng a1 + a2, lúc này kết quả sẽ là [3, 4, 4, 5]
removeAll(Collection) Hiệu 2 danh sách mảng a1.removeAll(a2) Kết quả sẽ là [3]; chỉ lấy a1, và loại bỏ các phần tử trùng nhau của danh sách mảng a1 và a2
retainAll(Collection) Chỉ lấy phần giao nhau của 2 danh sách mảng a1.retainAll(a2) Kết quả là [4]
boolean containsAll(Collection) Kiểm tra sự tồn tại (kiểm tra xem danh sách mảng này có phải là danh sách mảng con của danh sách mảng kia hay không) a1.containsAll(a2) Kết quả sẽ là false vì danh sách mảng a2 không phải là con của danh sách mảng a1, hay danh sách mảng a1 không chứa danh sách mảng a2
toArray(T[]) Chuyển đổi arraylist sang array ArrayList aList1 có các phần tử [2, 3, 4, 5]; aList1.array(tenMangMoi) Array: 2, 3, 4, 5 (KHÔNG CÓ ngoặc vuông)


Ví dụ:

import java.util.ArrayList;

public class Vidu_521 {
    public static void main(String[] args) {
        ArrayList  < Integer >  a1 = new ArrayList < Integer > ();
        a1.add(3);
        a1.add(4);
        ArrayList < Integer >  a2 = new ArrayList < Integer > ();
        a2.add(4);
        a2.add(5);
        System.out.print("a1: ");
        for(Integer x : a1){
            System.out.print(x+ " ");
        }
        System.out.print("\na2: ");
        for(Integer x : a2){
            System.out.print(x+ " ");
        }
        //--------------
        a1.addAll(a2);// HOP 2 TAP HOP
        System.out.print("\nHop 2 ArrayList(Cong 2 ArrayList):");
        for(Integer x : a1){
            System.out.print(x + " ");
        }
        //---------------
//        System.out.print("\nGiao 2 tap hop:");
//        a1.retainAll(a2);//GIAO 2 TAP HOP
//        for(Integer x : a1){
//            System.out.print(x+ " ");
//        }
        //--------------
//        System.out.print("\nHieu 2 tap hop: ");
//        a1.removeAll(a2);//HIEU 2 TAP HOP
//        for(Integer x : a1){
//            System.out.print(x+ " ");
//        }
    }
    
}
Noted: Bỏ chú thích từng đoạn để kiểm tra

2. Thao tác ArrayList nâng cao - Collections

Phương Thức Mô Tả Ví Dụ Giải Thích
int binarySearch (List list, Object key) Tìm kiếm nhị phân là một thuật toán tìm kiếm được sử dụng trong một mảng đã được sắp xếp bằng cách chia đôi mảng cần tìm kiếm nhiều lần
void fill (List list, Object value) Gán đồng loạt một giá trị chỉ định cho tất cả các phần tử trong một mảng. Arrays.fill(a, 10) Gán tất cả các phần tử của mảng có có giá trị là 10
void shuffle (List list) Xáo trộn ngẫu nhiên các phần tử của mảng
void sort (List list) Sắp xếp mảng theo giá trị tăng dần
void reverse (List list) Đảo ngược mảng Chúng ta có mảng: A, B, C, D; khi dùng hàm reverse sẽ cho kết quả: D, C, B, A
void rotate (List list, int distance) Để rotate các phần tử của List phụ thuộc vào tham số thứ 2 của phương thức đó trong Java
void swap(List list, int i, int j) Hoán đổi vị trí cho nhau Giá trị của phần thứ i và j sẽ hoán đổi cho nhau


Ví dụ:
import java.util.ArrayList;
import java.util.Collections;

public class Vidu_522 {
    public static void main(String[] args) {
        ArrayList < Integer > a = new ArrayList < Integer >();
        a.add(3);
        a.add(9);
        a.add(8);
        a.add(2);
        System.out.println("Array ban dau:");
        for(Integer x:a){
            System.out.print(x + " ");
        }
        System.out.println("\nSwap vi tri 0-2:");
        Collections.swap(a, 0, 2);
        for(Integer x:a){
            System.out.print( x + " ");
        }
        System.out.println("\nSort:");
        Collections.sort(a);
        for(Integer x:a){
            System.out.print(x + " ");
        }
        System.out.println("\nReverse:");
        Collections.reverse(a);
        for(Integer x:a){
            System.out.print(x+" ");
        }
    }
}

run:
Array ban dau:
3 9 8
Swap vi tri 0-2:
8 9 3
Sort:
2 3 8 9 
Reverse:
9 8 3 2 
BUILD SUCCESSFUL (total time: 0 seconds)

3. Bài tập
  • 5.4.2
Viết chương trình thực hiện các chức năng sau
1. Nhập danh sách họ và tên
2. Xuất danh sách vừa nhập

3. Xuất danh sách ngẫu nhiên
4. Sắp xếp giảm dần và xuất danh sách
5. Tìm và xóa họ tên nhập từ bàn phím
0. Kết thúc


Gợi ý: Tương tự mỗi yêu cầu chúng ta nên làm mỗi yêu cầu là một hàm riêng và thêm hàm về menu lựa chọn để gọi các yêu cầu và dùng Collections(shuffle, sort, reverse, remove, ..) để thực hiện các yêu cầu

Code:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class BaiTap_542 {
    public static void main(String[] args) {
        ArrayList < String > danhSach = new ArrayList < String >();
        Scanner in = new Scanner(System.in);
        int chon;
        do{
            luaChon();
            chon = in.nextInt();
            switch(chon){
                case 1: nhapDanhSach(danhSach); break;
                case 2: xuatDanhSach(danhSach); break;
                case 3: ngauNhien(danhSach); break;
                case 4: sapXepTangDan(danhSach); break;
                case 5: xoaDanhSach(danhSach); break;                
                default:
                    if(chon==0){
                        System.out.println("Hen gap lai!!!");
                        break;
                    }else{
                        System.out.println("1-5"); break;
                    }                    
            }
        }while(chon != 0);
    }
    
    public static void luaChon(){
        System.out.println(" >>  LUA CHON < < ");
        System.out.println("+--------------------+");
        System.out.println("| 1. Nhap danh sach ho va ten             |");
        System.out.println("| 2. Xuat danh sach vua nhap              |");
        System.out.println("| 3. Xuat danh sach ngau nhien            |");
        System.out.println("| 4. Sap xep tang dan va xuat danh sach   |");
        System.out.println("| 5. Tim va xoa ho ten nhap tu ban phim   |");
        System.out.println("| 0. Ket thuc                             |");
        System.out.println("+--------------------+");
        System.out.print(" >>  Lua chon cua ban!  ");  
    }
    
    public static void nhapDanhSach(ArrayList < String >  danhSach){
        String choice="";
        do{            
            Scanner in = new Scanner(System.in);
            System.out.print("Nhap Ho Ten: ");
            String hoten = in.nextLine();           
            System.out.print("Nhap tiep kg?(y/n)");
            choice = in.nextLine(); 
            danhSach.add(hoten);
        }while(choice.equalsIgnoreCase("y"));
    }
    
    public static void xuatDanhSach(ArrayList < String >  danhSach){
        System.out.println("------ Danh Sach Ten -----");
        int i=1;
        for(String x:danhSach){            
            System.out.println(i+"\t"+x);
            i++;
        }
    }
    
    public static void sapXepTangDan(ArrayList < String >  danhSach){
        System.out.println("------ Danh Sach Tang Dan -----");
        int i=1;
        Collections.sort(danhSach); // mat dinh sap xep tang dan
//        Collections.reverse(danhSach); // dao nguoc danh sach de co danh sach giam dan
        for(String x:danhSach){            
            System.out.println(i+"\t"+x);
            i++;
        }
    }
    
    public static void xoaDanhSach(ArrayList < String >  danhSach){
        Scanner in = new Scanner(System.in);
        boolean timThay=false;
        System.out.print("Nhap Ten: ");
        String ten = in.nextLine();
        for(int i=0;i < danhSach.size();i++){
            if(danhSach.get(i).equalsIgnoreCase(ten)){
                danhSach.remove(i);
                System.out.println("Da xoa!");
                timThay=true;
            }
        }
        if(!timThay)
            System.out.println("Khong tim thay!");
    }
    
    public static void ngauNhien(ArrayList < String >  danhSach){
        System.out.println("------ Danh Sach Ngau Nhien -----");
        int i=1;
        Collections.shuffle(danhSach);
        for(String x:danhSach){            
            System.out.println(i+"\t"+x);
            i++;
        }
    }
}

  • 5.4.3
Xây dựng ứng dụng quản lý sản phẩm (thông tin mỗi sản phẩm gồm tên và giá) theo menu sau
1. Nhập danh sách sản phẩm từ bàn phím
2. Sắp xếp giảm dần theo giá và xuất ra màn hình
3. Tìm và xóa sản phẩm theo tên nhập từ bàn phím

4. Xuất giá trung bình của các sản phẩm

Gợi ý:
Tổ chức ứng dụng tương tự bài 2
Sử dụng Collections.sort(list, comparator) để sắp xếp danh sách sản phẩm
với tiêu chí sắp xếp được định nghĩa như sau
Comparator<SanPham> comp = new Comparator<SanPham>() {
@Override
public int compare(SanPham o1, SanPham o2) {
return o1.donGia.compareTo(o2.donGia);
}
};



Xong!

[Tự Học Java] MOB1014-Java 1 - Bài 5 - ArrayList P1/2

NỘI DUNG:

1. ArrayList
2. Duyệt mảng ArrayList
3. Ví dụ
4. Bài tập

THỰC HIỆN:

Các mảng/Array chuẩn là có độ dài cố định. Sau khi các mảng được tạo, chúng không thể tăng hoặc giảm kích cỡ. Nếu mảng khai báo kích thước nhỏ thì không chứa đủ, nếu khai báo lớn thì gây lãng phí bộ nhớ,...

1. ArrayList các điểm cần chú ý:
  • Là mảng có thể thay đổi được kích thước (Khi kích cỡ này bị vượt, collection tự động được tăng. Khi các đối tượng bị gỡ bỏ, ArrayList có thể bị giảm kích cỡ.)
  • Rất mềm dẻo trong việc thêm/xóa các phần tử
  • Cho phép truy cập ngẫu nhiên, tốc độ truy xuất (get) phần tử nhanh vì nó lưu dữ liệu theo chỉ mục (index).
  • ArrayList còn cho phép thực hiện các phép toán tập hợp như hợp, giao, hiệu…

Các phương thức khởi tạo (constructor) của lớp 
  • ArrayList(): khởi tạo một danh sách mảng trống.
  • ArrayList(Collection c): khởi tạo một danh sách mảng được khởi tạo với các phần tử của collection c.
  • ArrayList(int capacity): khởi tạo một danh sách mảng mà có sức chứa (compacity) ban đầu được chỉ định. Nếu không chỉ định, mặc định là 10. Mỗi lần thêm một phần tử vào danh sách, nếu vượt quá sức chứa cho phép thì danh sách sẽ tự động tăng thêm 50% kích thước hiện có.
Cách khai báo:
    import java.util.ArrayList; // import ArrayList class
    // ArrayList kieuCu = new ArrayList(); // non-generic - kiểu cũ
    ArrayList <String> mauSac = new ArrayList <String>();  //khởi tạo oject ArrayList có tên là mauSac lưu trữ các chuỗi
    

    Các phương thức (method) hay dùng của ArrayList
    Phương Thức Mô Tả Ví Dụ Giải Thích
    boolean add(Object o) Thêm phần tử được chỉ định vào cuối một danh sách. mauSac.add("Xanh"); Thêm chuỗi "Xanh" vào cuối danh sách
    Object get(int index) Trả về phần tử tại index đã cho mauSac.get(0) Truy xuất vào phần tử thứ nhất của arraylist
    Object set(int index, Object element) Thay thế phần tử tại vị trí đã cho trong list này với phần tử đã xác định(giá trị mới) mauSac.set(1, "Vang"); Thay thế giá trị tại vị trí thứ HAI thành "Vang"
    boolean remove(Object) Xóa phần tử "Vang" ra khỏi arraylist mauSac.remove("Vang");
    Object remove(int index) Gỡ bỏ phần tử tại index đã cho mauSac.remove(1); Rỡ bỏ/xóa phần tử có Index = 1 ra khỏi arraylist
    void clear() Xóa tất cả các phần tử từ danh sách. mauSac.clear();
    int size() Kiểm tra arraylist có bao nhiêu phần tử mauSac.size();
    boolean isEmpty() Kiểm tra rỗng mauSac.isEmpty();
    boolean contains(Object) Kiểm tra sự tồn tại mauSac.contains("Xanh"); Kiểm tra Oject "Xanh" có tồn tại trong arraylist
    int indexOf(Object elem) Tìm vị trí phần tử


    Ví dụ:
    import java.util.ArrayList;
    public class ArrayList_Vidu {
        public static void main(String[] args) {
            ArrayList < String > mauSac = new ArrayList < String >(); //khởi tạo oject ArrayList có tên là mauSac lưu trữ các chuỗi
            mauSac.add("Xanh");
            mauSac.add("Do");
            mauSac.add("Trang");
            System.out.println("ArrayList: " + mauSac);        
            System.out.println("Trong ArrayList co mau 'Xanh' la: " + mauSac.contains("Xanh"));        
            System.out.println("Truy truy ArrayList: " + mauSac.get(0));
            
            mauSac.set(1, "Vang");
            System.out.println("ArrayList (VANG): " + mauSac);
            System.out.println("Tong so phan tu trong ArrayList: " + mauSac.size());
            System.out.println("Vi tri thu" + mauSac.indexOf("Trang"));
            
            mauSac.remove("Vang");
            mauSac.remove(1);
            mauSac.clear();
            
            System.out.println("Kiem tra mang rong: " + mauSac.isEmpty()); 
                   
        }
    }
    

    2. Duyệt mảng ArrayList
    Dùng FOR:
    for (int i = 0; i < duyetMang.size(); i++){
                System.out.println("Dung FOR: " + duyetMang.get(i));
            }
    

    Dùng FOREACH:
    for(Integer phanTu : duyetMang){
                System.out.println("Dung FOREARCH: " + phanTu);
            }
    

    Ví dụ:
    public class DuyetMang {
        public static void main ( String[] args) {
            ArrayList < Integer > duyetMang = new ArrayList<>();
            duyetMang.add(1);
            duyetMang.add(2);
            duyetMang.add(3);
            duyetMang.add(4);
            
            for (int i = 0; i < duyetMang.size(); i++){
                System.out.println("Dung FOR: " + duyetMang.get(i));
            }
            
            for(Integer phanTu : duyetMang){
                System.out.println("Dung FOREARCH: " + phanTu);
            }
        }
    }
    

    3. Ví dụ
    Khởi tạo class SVPoly với các biến: hoTen (String), diemTB (Double), sử dụng ArrayList <SVPoly> để nắm giữ các danh sách sinh viên, viết chương trình thực việc quản lý với các yêu cầu (người dùng được phép lựa chọn các tính năng thông qua menu chức năng):
    1. Nhập danh sách sinh viên
    2. Xuất danh sách sinh viên đã nhập
    3. Xuất danh sách sinh viên theo khoảng điểm
    4. Tìm sinh viên theo họ tên
    5. Tìm và sửa sinh viên theo họ tên
    6. Tìm và xóa theo họ tên
    7. Kết thúc

    Gợi ý:
    Mỗi yêu cầu chúng ta cần tạo một hàm riêng (6 hàm) và 1 hàm menu lựa chọn, sau đó chúng ta khai báo ở hàm main để gọi hàm menu lựa chọn, dùng switch case để xử lý (gọi hàm tương ứng) lựa chọn của người dùng.




    Class SVPoly
    code:
    public class SVPoly {
        public String hoTen;
        public Double diemTB; 
    }
    

    Code chính:
    import java.util.ArrayList;
    import java.util.Scanner;
    public class Vidu5 {
        public static void main(String[] args) {
            ArrayList< SVPoly >   danhSach = new ArrayList < SVPoly > ();
            Scanner in = new Scanner(System.in);
            int chon;
            do{
                luaChon();
                chon = in.nextInt();
                switch(chon){
                    case 1: nhapSinhVien(  danhSach); break;
                    case 2: xuatSinhVien(  danhSach); break;
                    case 3: xuatDsSvKhoangDiem(  danhSach); break;
                    case 4: timSinhVienTheoTen(  danhSach); break;
                    case 5: timSuaSinhVienTheoTen(  danhSach); break;
                    case 6: timXoaSinhVienTheoTen(  danhSach); break;
                    default:
                        if(chon==0){
                            System.out.println("Hen gap lai!!!");
                            break;
                        }else{
                            System.out.println("1-6"); break;
                        }                    
                }
            }while(chon != 0);
        }
        
        public static void luaChon(){
            System.out.println(">> LUA CHON << " );
            System.out.println("+--------------------+");
            System.out.println("| 1. Nhap danh sach sinh vien    |");
            System.out.println("| 2. Xuat danh sach sinh vien    |");
            System.out.println("| 3. Xuat DSSV theo khoang diem  |");
            System.out.println("| 4. Tim sinh vien theo ho ten   |");
            System.out.println("| 5. Tim va sua SV theo ho ten   |");
            System.out.println("| 6. Tim va xoa SV theo ho ten   |");
            System.out.println("| 0. Ket thuc        |");
            System.out.println("+--------------------+");
            System.out.print(">> Lua chon cua ban!  ");  
        }
        
        public static void nhapSinhVien(ArrayList < SVPoly >   danhSach){
            String choice="";
            do{
                SVPoly sv = new SVPoly();
                Scanner in = new Scanner(System.in);
                System.out.print("Nhap Ten SV: ");
                sv.hoTen = in.nextLine();
                System.out.print("Nhap Diem TB: ");
                sv.diemTB = in.nextDouble();in.nextLine();
                System.out.print("Nhap tiep khong?(y/n)");
                choice = in.nextLine(); 
                  danhSach.add(sv);
            }while(choice.equals("y") || choice.equals("Y"));
        }
        
        public static void xuatSinhVien(ArrayList < SVPoly >   danhSach){
            System.out.println("------ Danh Sach Sinh Vien -----");
            
            for(int i=0; i <   danhSach.size(); i++){
                System.out.println((i+1)+"\\t" +   danhSach.get(i).hoTen+"\\t"+   danhSach.get(i).diemTB);
            }
            
            //HOAC
            /* 
            int i = 1;
            for(SVPoly sv:  danhSach){            
                System.out.println(i+ "\\t"+sv.hoTen+"\\t"+sv.diemTB);
                i++;
            }
            */
        }
        
        public static void xuatDsSvKhoangDiem(ArrayList < SVPoly >   danhSach){
        }
    
        public static void timSinhVienTheoTen(ArrayList < SVPoly >   danhSach){
            Scanner in = new Scanner(System.in);
            boolean timThay = false;
            System.out.print("Nhap Ten SV can tim: ");
            String ten = in.nextLine();
            for(int i=0;i < danhSach.size();i++){
                if(  danhSach.get(i).hoTen.equalsIgnoreCase(ten)){
                    System.out.println("Da tim thay");
                    System.out.println("Ten SV: "+  danhSach.get(i).hoTen);
                    System.out.println("Diem SV: "+  danhSach.get(i).diemTB);
                    timThay = true;
                }
            }
            if(!timThay)
                System.out.println("Khong tim thay!");
        }
        
        public static void timSuaSinhVienTheoTen(ArrayList < SVPoly >   danhSach){
        }
        
        public static void timXoaSinhVienTheoTen(ArrayList < SVPoly >   danhSach){
            
        }
        
    }
    

    4. Bài Tập
    • Bài 1. Nhập danh sách số thực với (số lượng tùy ý từ bàn phím) sau đó xuất danh sách vừa nhập và tổng của nó.
    Code:
    import java.util.ArrayList;
    import java.util.Scanner;
    public class BaiTap_541 {
        public static void main(String[] args) {
            ArrayList < Double > list = new ArrayList < Double >();
            Scanner in = new Scanner(System.in);
            
            //Nhap so thuc x
            while(true){
                System.out.print("Nhap so thuc x: ");
                Double x = in.nextDouble();
                list.add(x);in.nextLine();
                System.out.print("Nhap them(Y/N):");
                if(in.nextLine().equalsIgnoreCase("N")){
                    break;
                }
            }
            
            // in so thuc
            System.out.println("================");
            System.out.println("ArrayList: ");
            for(Double x:list){
                System.out.print(x + ", ");
            }
            
            //Tinh tong
            System.out.println();
            Double sum=0.0;
            for(Double x:list){
                sum += x;            
            }
            System.out.println("Tong cac so trong ArrayList la: " + sum);
        }
    }
    



    Xong!

    [Tự Học Java] MOB1014-Java 1 - Bài 4 - Class & Object - Overloading/Nạp Chồng, Constructor/Phương Thức Khởi Tạo P2/2

    NỘI DUNG:
    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:

    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): SV999
    Ma so SV (LA CHUOI): SV123
    Ma so SV (LA SO): SV456
    Ma so SV (LA CHUOI, va LA SO): SV789
    BUILD 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: SV000
    Ho ten: Tony TEO
    Nam sinh: 2000
    ==================
    Ma SV: SV123
    Ho ten: Van Cong Khanh
    Nam sinh: 2222
    BUILD 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!
    /*header slide*/