Tổng quan về các mức truy cập
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 10 trên 87.
Bộ điều chỉnh quyền truy cập kiểm soát nơi có thể truy cập các trường và phương thức. Java có bốn cấp độ kiểm soát quyền truy cập.
| Bộ bổ nghĩa | Cùng lớp | Cùng package | Lớp con | Mọi nơi |
|---|---|---|---|---|
private | Có | Không | Không | Không |
| default (không có từ khóa) | Có | Có | Không | Không |
protected | Có | Có | Có | Không |
public | Có | Có | Có | Có |
public class BankAccount {
private double balance; // Chỉ trong lớp này
String accountType; // Mặc định: chỉ trong cùng package
protected String owner; // Trong cùng package và các lớp con
public String bankName; // Có thể truy cập từ mọi nơi
}private là mức hạn chế nhất, hãy dùng nó cho dữ liệu nội bộ mà không bao giờ được truy cập trực tiếp. public là mức mở nhất, hãy dùng nó cho các phương thức mà lớp khác cần gọi.
Khi bạn không chỉ định bộ sửa đổi nào, Java sử dụng quyền truy cập mặc định (còn gọi là package-private). Quyền này chỉ cho phép truy cập trong cùng một package.
class Helper { // Lớp có quyền truy cập mặc định
void assist() { } // Phương thức có quyền truy cập mặc định
}Hãy chọn cấp độ truy cập hạn chế nhất mà vẫn giúp code hoạt động. Cách này bảo vệ dữ liệu và giúp bạn dễ bảo trì code hơn.
Thử thách
DễHãy xây dựng một hệ thống quản lý hồ sơ Student để minh họa cách các từ bổ nghĩa quyền truy cập (access modifiers) kiểm soát khả năng hiển thị trên nhiều tệp khác nhau.
Bạn sẽ tạo hai tệp để sắp xếp code:
Student.java: Định nghĩa một lớp Student với các trường có mức độ truy cập khác nhau:- Trường
private:studentId(String), chỉ có thể truy cập bên trong lớp Student - Trường mặc định (không có từ bổ nghĩa):
grade(int), có thể truy cập trong cùng gói - Trường
protected:name(String), có thể truy cập trong cùng gói và trong các lớp con - Trường
public:school(String), có thể truy cập ở mọi nơi
publiccó têngetInfo()trả về một chuỗi theo định dạng:"[studentId] name - Grade grade at school"- Trường
Main.java: Tạo một đối tượng Student và minh họa những trường nào có thể được truy cập trực tiếp từ bên ngoài lớp. In trực tiếp trườngschool, sau đó in kết quả củagetInfo()để hiển thị toàn bộ thông tin của học sinh.
Bạn sẽ nhận được bốn đầu vào: studentId, name, grade và school, theo thứ tự đó.
Đầu ra của bạn gồm hai dòng: tên trường học được truy cập trực tiếp, tiếp theo là thông tin đầy đủ của học sinh từ phương thức getInfo().
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc các giá trị đầu vào
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int grade = Integer.parseInt(scanner.nextLine());
String school = scanner.nextLine();
// TODO: Tạo đối tượng Student bằng các giá trị đầu vào
// TODO: In trực tiếp trường school (có thể truy cập vì trường này là public)
// TODO: In kết quả của getInfo() để hiển thị toàn bộ thông tin sinh viên
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online