Java 这门语言里,封装、继承、多态几乎是绕不开的三个概念。它们不是孤立的知识点,写到后面你会发现,类的设计、接口的拆分、方法的调用方式,基本都能落到这三件事上。
封装:把边界先立起来
封装说白了就是把数据和行为放在一起,同时尽量不把内部细节直接暴露出去。外部只和你提供的接口打交道,至于对象内部怎么存、怎么校验,尽量留在类里面处理。
Java 里最常见的做法就是配合访问修饰符。private 最严,外部不能直接碰;default、protected、public 依次放宽权限。实际开发里,属性通常会设成 private,再通过 getter 和 setter 暴露必要的访问入口。这样做不是为了'看起来规范',而是为了把校验逻辑收拢到一个地方,避免别人随手把对象状态改坏。
public class Student {
// 私有属性,外部无法直接访问
private String name;
private int age;
// getter 方法,获取姓名
public String getName() {
return name;
}
// setter 方法,设置年龄并校验
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
} else {
System.out.println("年龄不合法");
}
}
}
封装真正省心的地方,不是'藏起来'本身,而是以后改实现时影响面小。只要对外接口不动,内部怎么调整都比较从容。
继承:把复用做得更直接
继承解决的是'已有代码别重复写'的问题。子类可以拿到父类的属性和方法,在此基础上补自己的东西,或者把父类的实现换成更适合自己的版本。
Java 用 extends 表示继承,而且是单继承:一个类只能直接继承一个父类。这个限制有时会让人觉得别扭,但也把类层次压得更清楚,避免继承关系乱成一团。所有类最终都绕不开 Object,如果你没显式写父类,编译器也会默认补上。
继承之后,常见的动作就这几种:直接使用父类的 public 和 protected 成员;在子类里重写父类方法;再补充一些子类自己的属性和方法。重写时要守住方法签名一致这条线,平时写代码时最容易踩坑的反而是访问权限和返回值这些细节。
final 方法不能重写,final 类不能被继承,这些限制本质上是在告诉你:这部分设计不希望再往下改了。super 则是子类访问父类成员的入口,调父类实现时会用到。
// 父类
{
{
System.out.println();
}
}
{
{
System.out.println();
}
{
System.out.println();
}
}


