访问级别概览
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 10 课,共 87 课。
访问修饰符用于控制字段和方法可以从哪里访问。Java 有四个访问控制级别。
| 修饰符 | 同一个类 | 同一个包 | 子类 | 任何地方 |
|---|---|---|---|---|
private | 是 | 否 | 否 | 否 |
| 默认(无关键字) | 是 | 是 | 否 | 否 |
protected | 是 | 是 | 是 | 否 |
public | 是 | 是 | 是 | 是 |
public class BankAccount {
private double balance; // 仅此类可访问
String accountType; // 默认:仅同一包内可访问
protected String owner; // 同一包内及子类可访问
public String bankName; // 任何地方都可访问
}private 的限制最严格,适用于绝不应被直接访问的内部数据。public 的限制最少,适用于其他类需要调用的方法。
如果你没有指定任何修饰符,Java 会使用默认(也称为包级私有)访问权限。这只允许在同一个包内访问。
class Helper { // 默认访问权限的类
void assist() { } // 默认访问权限的方法
}选择仍能让代码正常运行的最严格访问级别。这样可以保护你的数据,也让代码更易于维护。
挑战
简单让我们构建一个 Student 记录系统,演示访问修饰符如何控制不同文件中的可见性。
你将创建两个文件来组织代码:
Student.java:定义一个 Student 类,其中的字段使用不同的访问级别:private字段:studentId(String),只能在 Student 类内部访问- 默认字段(没有修饰符):
grade(int),可在同一包内访问 protected字段:name(String),可在同一包内及子类中访问public字段:school(String),可在任何地方访问
getInfo()的public方法,该方法返回格式如下的字符串:"[studentId] name - Grade grade at school"Main.java:创建一个 Student 对象,并演示哪些字段可以在类外直接访问。直接打印school字段,然后打印getInfo()的返回结果,以显示学生的全部信息。
你将收到四个输入:studentId、name、grade 和 school(按此顺序)。
输出应为两行:第一行是直接访问的学校名称,第二行是 getInfo() 方法返回的完整学生信息。
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int grade = Integer.parseInt(scanner.nextLine());
String school = scanner.nextLine();
// TODO: 用输入值创建一个 Student 对象
// TODO: 直接输出 school 字段(它是 public,可以直接访问)
// TODO: 输出 getInfo() 的结果,显示学生的所有信息
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器