第 8 课 / 共 9 课16 分钟2 个闯关

封装与 static

private + getter/setter 把门关上;main 为什么必须是 static。

属性裸露在外面的麻烦

上一课的 Student 有个隐患:

Student s = new Student("小明", 88);
s.score = -999;      // 谁都能改成任何值
s.score = 10000;

分数变成 -999,程序不会报错,但数据已经烂了。而且出问题时你无从查起——任何一行代码都可能是凶手

封装:把门关上,只留窗口

public class Student {
    private String name;      // private:只有类内部能访问
    private double score;

    public Student(String name, double score) {
        this.name = name;
        setScore(score);       // 走统一入口,校验逻辑只写一份
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        if (score < 0 || score > 100) {
            throw new IllegalArgumentException("分数必须在 0~100 之间,收到:" + score);
        }
        this.score = score;
    }

    public String getName() {
        return name;          // 只有 getter 没有 setter → 只读,姓名不许改
    }
}

现在 s.score = -999; 直接编译失败。想改分数只能走 setScore,而校验就守在那里。

这就是封装的全部意义:把"能被谁改、怎么改"收拢到一个地方。 出了问题只需要看一个方法。

四个访问修饰符

修饰符谁能访问什么时候用
private只有本类属性默认全用它
不写(包级)同一个包少用
protected同包 + 子类给子类留的接口
public所有人你确定要对外公开的方法

实践准则很简单:属性一律 private,对外的方法才 public。 先关死再按需开门,比先全开再想关容易得多。

getter / setter 的命名规矩

public String getName()              // get + 属性名(首字母大写)
public void setName(String name)     // set + 属性名
public boolean isPassed()            // boolean 用 is 开头

这套命名不是审美问题,是约定——Spring、Jackson 等大量框架靠这个规则自动读写你的对象。名字写错,框架就找不到。IDE 可以一键生成,别手敲。

static:属于类,不属于对象

public class Student {
    private static int count = 0;    // 所有对象共用这一份
    private String name;

    public Student(String name) {
        this.name = name;
        count++;
    }

    public static int getCount() {   // 静态方法,用类名调用
        return count;
    }
}

new Student("小明");
new Student("小红");
System.out.println(Student.getCount());   // 2

name 每个对象各有一份,count 全类共用一份。

这也解释了第一课那个 public static void main:程序刚启动时一个对象都还没有,所以入口方法必须是 static 的,才能在没有对象的情况下被调用。

一条硬规则:静态方法里不能直接用非静态属性。因为静态方法不知道"你说的是哪个对象的属性"。

常量:static final 组合

public static final int MAX_SCORE = 100;

static = 全类共用一份,final = 不许改。这是 Java 定义常量的标准写法。

10 秒自测

为什么 main 方法必须是 static 的?

因为程序启动时还没有任何对象存在,JVM 需要在不创建对象的前提下调用它。

广告位(未配置 AdSense,上线后在此展示)

动手闯关

读懂了不算会,写出来才算

0/2 已通过

闯关和判题完全免费,交错了不扣任何东西。卡住随时点「问 AI」,它能看到你正在写的代码。

关卡 01选择+10 点 · +15 XP

main 为什么是 static

为什么 `main` 方法必须声明成 static?

  • 可能是多选,选错不扣点数,随便试。
登录后闯关拿点数
关卡 02选择+10 点 · +15 XP

属性该用什么修饰符

按照 Java 的通行实践,类的属性默认应该用哪个访问修饰符?

  • 可能是多选,选错不扣点数,随便试。
登录后闯关拿点数

学完了?标记一下

标记完成会记进度、涨 20 XP,还会点亮连续学习天数。