1. Từ khóa private, public, protected và default
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.
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.
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
maSinhViencần được truy cập trong lớp con nhưng không công khai:
1.4 Truy cập mặc định (default)
- Ý nghĩa: Nếu không chỉ định rõ
private,publichayprotected, 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:
finalvớ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.finalvới phương thức: Một phương thứcfinalkhông thể bị ghi đè bởi lớp con.finalvới lớp: Một lớpfinalkhô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
staticdù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:
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:
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óasuperđược dùng để gọi constructor của lớpSinhVien: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; }
Tóm lại:
-
private→ chỉ trong lớp -
protected→ lớp con + cùng package -
default→ cùng package -
public→ ở mọi nơi -
final→ không thể thay đổi/kế thừa -
static→ dùng chung -
this→ đối tượng hiện tại -
super→ lớp cha
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
SinhViennhư đã giới thiệu (bao gồm các thuộc tínhmaSinhVien,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
SinhVienChinhQuykế thừa từSinhVien, thêm thuộc tínhmaLop. - Tạo lớp
SinhVienLienThongkế thừa từSinhVien, ghi đè phương thứctinhDiemTrungBinh()để 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.
