1. Từ khóa private, public, protecteddefault

Trong Java, các từ khóa truy cập (access modifiers) đóng vai trò quan trọng trong việc kiểm soát quyền truy cập vào các thuộc tính và phương thức. Chúng giúp thực hiện nguyên tắc Encapsulation (Đóng gói), đảm bảo rằng các thông tin nhạy cảm của đối tượng được bảo vệ.

1.1 Từ khóa private
  • Ý nghĩa: Chỉ cho phép các phương thức trong cùng một lớp truy cập các thuộc tính hoặc phương thức được đánh dấu là private.
  • Ứng dụng: Dùng để bảo vệ dữ liệu, tránh việc truy cập trực tiếp từ bên ngoài lớp.
  • Ví dụ: Trong lớp SinhVien, các thuộc tính như maSinhVien, hoTen, diemLTCpp đều được khai báo là private.

private String maSinhVien; // Chỉ có thể truy cập từ bên trong lớp SinhVien

public String getMaSinhVien() {
return maSinhVien; // Phương thức công khai để truy cập thuộc tính private

1.2 Từ khóa public
  • Ý nghĩa: Cho phép mọi lớp truy cập mà không có bất kỳ hạn chế nào.
  • Ứng dụng: Dùng cho các phương thức hoặc thuộc tính cần truy cập từ bất kỳ đâu, ví dụ: phương thức hienThiThongTin() trong bài toán.

public void hienThiThongTin() {

System.out.println(“Mã SV: “ + maSinhVien + “, Họ tên: “ + hoTen);

System.out.println(“Điểm trung bình: “ + tinhDiemTrungBinh()); }
}

1.3 Từ khóa protected
  • Ý nghĩa: Cho phép các lớp con và các lớp trong cùng một package truy cập.
  • Ứng dụng: Dùng trong các tình huống cần chia sẻ dữ liệu giữa lớp cha và lớp con nhưng không muốn công khai hoàn toàn.
  • Ví dụ: Nếu maSinhVien cần được truy cập trong lớp con nhưng không công khai:
protected String maSinhVien;
public String getMaSinhVien() {
return maSinhVien; }
1.4 Truy cập mặc định (default)
  • Ý nghĩa: Nếu không chỉ định rõ private, public hay protected, thì mặc định chỉ cho phép truy cập trong cùng một package.
  • Ứng dụng: Ít được dùng trong bài toán quản lý sinh viên vì dữ liệu sinh viên thường cần bảo vệ hoặc chia sẻ với lớp con.

2. Từ khóa final

Từ khóa final có nhiều ứng dụng trong Java:

  • final với biến: Khi một biến được khai báo là final, giá trị của nó không thể thay đổi sau khi được gán.
  • final với phương thức: Một phương thức final không thể bị ghi đè bởi lớp con.
  • final với lớp: Một lớp final không thể được kế thừa.

Ví dụ: Trong bài toán, giả sử mã sinh viên không được phép thay đổi sau khi gán, ta sử dụng final:

private final String maSinhVien;

public SinhVien(String maSinhVien, String hoTen, double diemLTCpp, double diemLTJava, double diemLTWeb) { this.maSinhVien = maSinhVien; // Mã sinh viên chỉ được gán một lần

this.hoTen = hoTen;

this.diemLTCpp = diemLTCpp;

this.diemLTJava = diemLTJava;

this.diemLTWeb = diemLTWeb; }

3. Từ khóa static

  • Ý nghĩa: Từ khóa static dùng để khai báo các thuộc tính và phương thức dùng chung cho tất cả các đối tượng của một lớp.
  • Ứng dụng: Dùng để khai báo các hằng số hoặc phương thức tiện ích.
  • Ví dụ: Trong bài toán, nếu muốn đếm số lượng sinh viên đã được tạo, ta dùng một biến static:
public class SinhVien {
private static int soLuongSinhVien = 0; // Biến dùng chung cho tất cả các đối tượng
public SinhVien(String maSinhVien, String hoTen, double diemLTCpp, double diemLTJava, double diemLTWeb) { this.maSinhVien = maSinhVien;
this.hoTen = hoTen;
this.diemLTCpp = diemLTCpp;
this.diemLTJava = diemLTJava;
this.diemLTWeb = diemLTWeb;
soLuongSinhVien++; // Tăng biến đếm mỗi khi tạo sinh viên } public static int getSoLuongSinhVien() { return soLuongSinhVien; // Truy cập biến static qua phương thức static
} }

4. Từ khóa this

  • Ý nghĩa: Đại diện cho đối tượng hiện tại.
  • Ứng dụng: Dùng để phân biệt thuộc tính của lớp và tham số phương thức, hoặc gọi các phương thức khác trong cùng một lớp.
  • Ví dụ: Trong constructor, từ khóa this được dùng để tránh xung đột giữa tên biến tham số và thuộc tính:
public SinhVien(String maSinhVien, String hoTen, double diemLTCpp, double diemLTJava, double diemLTWeb) { this.maSinhVien = maSinhVien; // `this` tham chiếu tới thuộc tính của lớp
this.hoTen = hoTen;
this.diemLTCpp = diemLTCpp;
this.diemLTJava = diemLTJava; this.diemLTWeb = diemLTWeb;
}

5. Từ khóa super

  • Ý nghĩa: Dùng để gọi constructor hoặc phương thức của lớp cha.
  • Ứng dụng: Trong kế thừa, giúp lớp con tái sử dụng constructor hoặc phương thức của lớp cha.
  • Ví dụ: Trong lớp SinhVienChinhQuy, từ khóa super được dùng để gọi constructor của lớp SinhVien:public SinhVienChinhQuy(String maSinhVien, String hoTen, double diemLTCpp, double diemLTJava, double diemLTWeb, String maLop) { super(maSinhVien, hoTen, diemLTCpp, diemLTJava, diemLTWeb); // Gọi constructor lớp cha this.maLop = maLop; }

CÂU HỎI 

1. Giải thích sự khác nhau giữa các từ khóa truy cập: private, protected, public, và default. Khi nào nên sử dụng từng loại?

2. Trong lập trình hướng đối tượng, từ khóa static được sử dụng như thế nào? Hãy nêu ví dụ minh họa và giải thích ý nghĩa.

3. Từ khóa final có thể được áp dụng cho những thành phần nào trong Java? Hãy giải thích ý nghĩa khi sử dụng final với:

– Biến

– Phương thức

– Lớp

BÀI TẬP

1. Viết một chương trình Java với các yêu cầu sau:

  • Tạo lớp SinhVien như đã giới thiệu (bao gồm các thuộc tính maSinhVien, hoTen, diemLTCpp, diemLTJava, diemLTWeb).
  • Thêm một thuộc tính tĩnh soLuongSinhVien để đếm số sinh viên được tạo.
  • Viết một phương thức hienThiThongTinSoLuong() để hiển thị tổng số sinh viên.
  • Tạo 3 đối tượng sinh viên và kiểm tra kết quả.

2. Sử dụng kế thừa và đa hình để mở rộng bài toán:

  • Tạo lớp SinhVienChinhQuy kế thừa từ SinhVien, thêm thuộc tính maLop.
  • Tạo lớp SinhVienLienThong kế thừa từ SinhVien, ghi đè phương thức tinhDiemTrungBinh() để chỉ tính điểm trung bình của hai môn: Lập trình C++ và Lập trình Java.
  • Tạo một danh sách sinh viên (gồm cả chính quy và liên thông), duyệt danh sách và hiển thị thông tin của tất cả sinh viên cùng với điểm trung bình được tính theo cách riêng của từng lớp.