正在加载...

Java 访问控制

在 Gate.java 里写一个类 Gate,带有 private int 字段 code、把 code = n; 的构造方法 Gate(int n),以及打印 code 的方法 void show()。在 Pier.java 里用 Gate g = new Gate(9); 建一个 gate,再调用 g.show();。编译这两个文件并运行 java Pier。屏幕应显示一行:9。字段对 Pier 隐藏。Gate 上的方法仍可读它。给字段加上 private,就是本页要教的内容。

Pier 不该直接点名的字段

到目前为止,同一文件夹里的其他类往往还能碰到像 j.fill 或 t.size 这样没有访问词的字段。单词 private 会改变这一点。private 字段属于声明它的那个类。同一类里的方法可以使用该字段。另一个类——这里是 Pier——不该写 g.code。
先创建 Gate.java。public class 行是 public class Gate。不要在这里留下旧的 Tag 或 Jar 类名。在花括号里声明 private int code;。写构造方法 Gate(int n) { code = n; },参数名与字段名不同,这样本页不需要 this。然后写:
void show() { System.out.println(code); }
Gate.java 里没有 main。编译前先保存。方法 show 与 code 在同一类中,因此它可以读 private 字段。这就是本页允许的路径。

Gate with private code

java
public class Gate {
    private int code;

    Gate(int n) {
        code = n;
    }

    void show() {
        System.out.println(code);
    }
}

Pier 调用 show,而不是 g.code

在同一文件夹创建 Pier.java。它的 public class 行是 public class Pier。在 main 里写 Gate g = new Gate(9);,再写 g.show();。本页不要写 System.out.println(g.code);。若 code 是 private,却从 Pier 去读 g.code,javac 会拒绝。
把 Pier 保持为持有 main 的类。本课不要把 main 放进 Gate。若 static 页留下的 Yard 文件仍在文件夹里,本课不要运行 java Yard——编译 Gate.java 和 Pier.java 之后运行 java Pier。

Pier calls show

java
public class Pier {
    public static void main(String[] args) {
        Gate g = new Gate(9);
        g.show();
    }
}

在放着这两个文件的文件夹里运行 javac Gate.java Pier.java。两个文件都写好后,也可以先编译 Gate.java,再编译 Pier.java。当圆括号、花括号和分号都配对时,javac 不会自己写出一行。然后运行 java Pier——不要 java Pier.java,也不要 java Gate。运行命令不要带 .java 结尾。启动带有 main 的那个类。同样的命令在 Windows 和 macOS 上都可用。
程序应打印一行后停止:9。它不会让你输入。如果终端在等待键盘输入,说明某个文件里还留着旧练习的 nextLine 调用。删掉那个调用,在 Pier 里保留 new Gate(9) 和 g.show();,并在 Gate 里保留 private int code。
把运行走一遍。Java 从 Pier.main 开始。表达式 new Gate(9) 构建一个 gate,并在构造方法里把 9 存进 code。调用 g.show() 进入同一对象上的 show。在 Gate 内部,show 可以读 code 并打印 9。Pier 从未点名该字段。屏幕显示 9。
若在 Pier 里写成 System.out.println(g.code); 而不是 g.show();,只要 code 仍是 private,javac 就会因访问错误停下。这种拒绝正是本页的要点。请把 g.show(); 放回去。

与 static 以及开放字段对比

在 static 那一页,你调用 Tag.ping();,没有需要隐藏的对象字段。那种写法仍然有效。本页隐藏一个字段,并开放一个方法。残留的 Tag.ping(); 演示是另一课。本页请保留 Gate、Pier 和 g.show();。
更早的页面常常不给字段加 private,所以从另一个类写 j.fill 也能编译。那种更松的形态在小演示里仍会出现。本课有意选择 private,好让你看见边界。单独用 System.out.println(g); 打印 g,不会给出干净的 9。请调用 g.show();,或通过类允许的方法来打印。

两个 gate,两个 code

每一次 new Gate(...) 都保留自己的 private code。你可以写 Gate a = new Gate(2); 和 Gate b = new Gate(8);,再调用 a.show(); 和 b.show();。

Pier shows two gates

java
public class Pier {
    public static void main(String[] args) {
        Gate a = new Gate(2);
        Gate b = new Gate(8);
        a.show();
        b.show();
    }
}

再次编译并运行:javac Gate.java Pier.java,然后 java Pier。屏幕应在一行显示 2,下一行显示 8。每一次 show 调用都跑在各自的对象上,并读取该对象的 private 字段。写成 Gate b = a; 并不会构建第二个对象——若要两个 code,请用两次 new Gate(...)。
若两行显示同一个数,请检查每次 new 是否传入不同参数。若 javac 抱怨 Pier 里的 code,说明你仍留着直接的 g.code 行——删掉它,保留 show。

留给 packages 的内容

本页把两个文件放在同一文件夹,使用默认包布局。后面一页——packages——会用 package 行把类放进命名文件夹。这里先留在 private 和 show 上。本页不要发明完整的 public/protected 对照表;本课目标是一个 private 字段,以及仍能读它的一个方法。
若编译 Pier.java 时 javac 找不到 Gate,请检查 Gate.java 是否在同一文件夹,且类行是 public class Gate。若文件夹里仍有 Tag.java 或 Yard.java,可以不动它们,或仅在它们干扰编译命令时删除。编译本课的 Gate 与 Pier 这对文件之后,运行 java Pier。

进入 packages 之前

你可以声明 private int code;,写 Gate(int n) { code = n; } 和 void show() { System.out.println(code); },并从 Pier 运行 Gate g = new Gate(9);,再 g.show();。编译这两个文件并运行 java Pier。屏幕显示 9。private 字段留在 Gate 内。同一类的方法把它打印出来。下一页是 packages,你会把类放进命名的包文件夹。
字段上保留 private。打印留在 show 里,不要从 Pier 写 g.code。把 main 留在 Pier。这三项习惯是本页继续前进前的检查点。当屏幕通过 show 显示 9 时,你已经按本课意图跨过了访问边界。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部