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
maSinhVien
cầ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
,public
hayprotected
, 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ứcfinal
không thể bị ghi đè bởi lớp con.final
với lớp: Một lớpfinal
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
:
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; }
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í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
SinhVienChinhQuy
kế thừa từSinhVien
, thêm thuộc tínhmaLop
. - Tạo lớp
SinhVienLienThong
kế 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.