Menu
CoddyTech

访问级别概览

本课属于 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() { }    // 默认访问权限的方法
}

选择仍能让代码正常运行的最严格访问级别。这样可以保护你的数据,也让代码更易于维护。

challenge icon

挑战

简单

让我们构建一个 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() 的结果,显示学生的所有信息
        
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Java 在线编译器