Menu
CoddyTech

信息隐藏

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 12 课,共 87 课。

信息隐藏是一种限制直接访问对象内部数据的原则。将 private 字段与 getter 和 setter 结合起来,可以为对象的状态建立一道保护屏障。

想一想,如果没有信息隐藏,会发生什么:

public class Temperature {
    public double celsius;  // 直接对外暴露
}

// 任何人都可以设置无效的值
Temperature t = new Temperature();
t.celsius = -500;  // 低于绝对零度,不可能!

通过信息隐藏,你可以控制数据的访问和修改方式:

public class Temperature {
    private double celsius;
    
    public void setCelsius(double celsius) {
        if (celsius >= -273.15) {
            this.celsius = celsius;
        }
    }
    
    public double getCelsius() {
        return celsius;
    }
}

现在,无效温度会被自动拒绝。内部表示被隐藏了,这样你以后可以更改温度在内部的存储方式(也许改用开尔文),而不会影响使用该类的代码。

这种方法有三个主要优点:验证可确保数据完整性,灵活性允许你在不破坏外部代码的情况下更改内部实现,控制则让你准确决定允许对数据执行哪些操作。

challenge icon

挑战

简单

我们来创建一个 Password 管理类,通过保护敏感数据并通过受控访问强制执行安全规则,来演示信息隐藏。

你将创建两个文件来组织代码:

  • Password.java:创建一个 Password 类,隐藏内部数据,并控制密码的设置和访问方式:
    • 一个私有的 password 字段(String),用于存储实际密码
    • 一个私有的 minLength 字段(int),用于定义可接受的最小密码长度
    • 一个接收最小长度要求的构造函数
    • 一个设置器 setPassword(String password),只接受达到最小长度要求的密码。如果密码有效,就存储密码并返回 true;如果密码太短,就不更改密码并返回 false
    • 一个获取器 getMaskedPassword(),返回将所有字符替换为星号(*)后的密码。绝不泄露实际密码!
    • 一个方法 checkPassword(String attempt),如果尝试输入的密码与存储的密码匹配,就返回 true,否则返回 false
    • 一个获取器 getLength(),返回当前密码的长度(如果未设置密码,则返回 0)
  • Main.java:创建一个最小长度为 6 的 Password 对象,然后读取两个输入:要设置的密码和要检查的尝试输入。打印三行:
    • Set: true 或 Set: false(设置密码的结果)
    • Masked: ******(密码的掩码版本)
    • Match: true 或 Match: false(检查尝试输入的结果)

你将收到两个输入:要设置的密码,以及要检查的尝试输入。

注意,实际密码无法从类外部直接访问,这正是信息隐藏的体现。这个类会精确控制哪些信息可以被公开,以及如何修改密码。

亲手试试

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取要设置的密码
        String passwordToSet = scanner.nextLine();
        // 读取要检查的密码尝试值
        String passwordAttempt = scanner.nextLine();
        
        // TODO: 创建一个最小长度为 6 的 Password 对象
        
        // TODO: 设置密码并打印结果("Set: true" 或 "Set: false")
        
        // TODO: 打印遮盖后的密码("Masked: ******")
        
        // TODO: 检查尝试输入的密码并打印结果("Match: true" 或 "Match: false")
        
    }
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Java 在线编译器