面向对象基础
约 1013 字大约 3 分钟
布欧-Lewyon
2026-05-14
本节是面向对象章节的起点,介绍类与对象、封装、this 关键字、构造器以及 Java 16 引入的 record,为你建立 OO 编程的第一印象。
类与对象
类是模板,描述一组对象共有的结构(字段)与行为(方法)。对象是类的实例,在堆内存中分配空间。
// 定义类
public class Student {
String name;
int age;
void sayHello() {
System.out.println("你好,我是 " + name);
}
}
// 创建对象
public class Main {
public static void main(String[] args) {
Student s = new Student();
s.name = "小明";
s.age = 18;
s.sayHello();
}
}new 类名() 在堆上分配内存并返回对象的引用。上述例子中字段为包级私有,同一个包内可直接访问。
封装与访问控制
封装是指将字段设为私有(private),通过 public 方法提供受控的访问,从而隐藏内部实现,保证数据完整性。
| 修饰符 | 本类 | 同包 | 子类 | 其他 |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
| 默认(无修饰符) | ✅ | ✅ | ❌ | ❌ |
protected | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
public class BankAccount {
private double balance; // 私有字段,外部不能直接修改
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public double getBalance() {
return balance;
}
}将字段用 private 包装、通过 getter / setter 暴露,是最常见的封装实践。注意不要写出没有业务逻辑的「纯字段暴露」——如果真的有,考虑直接 public 或使用 record。
this 关键字
在实例方法或构造器中,this 指向当前调用该方法的对象,常用于:
- 区分参数与字段:
this.name = name; - 构造器间调用:
this() / this(参数)
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name; // 参数 name 赋值给字段 this.name
this.age = age;
}
public Person(String name) {
this(name, 0); // 调用上面两个参数的构造器
}
}构造器间调用的 this() 必须放在构造器第一行。
构造器
- 构造器名称与类名相同,没有返回类型(连
void也不写)。 - 如果未显式定义任何构造器,编译器会生成一个无参默认构造器。
- 一旦定义了带参构造器,默认无参构造器不再自动生成(需要手动写)。
public class Book {
private String title;
private String author;
// 自定义构造器
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// 需要无参时需手动写
public Book() {
this("未命名", "匿名");
}
}初识 record(Java 16 正式版)
record 是一种透明数据载体,自动生成构造器、equals、hashCode、toString 和字段访问方法,适合纯粹承载数据的场景:
public record Point(int x, int y) {}
// 使用时
Point p = new Point(3, 4);
System.out.println(p.x()); // 访问方法名为 x(),不是 getX()
System.out.println(p); // Point[x=3, y=4]record的字段默认是private final;record本身是final类,不能被继承。- 可在
record体内添加方法或紧凑构造器做参数校验,但不建议加入可变状态。 - 不适合需要可变字段或继承的场景,此时仍用普通 class。
小结
- 类(模板)→
new→ 对象(实例),字段与方法构成类的成员。 - 封装通过访问控制实现:
private隐藏内部状态,public方法提供受控访问入口。 this用于区分参数与字段,或构造器间调用(必须第一行)。- 构造器名称与类名相同、无返回类型;一旦定义了带参构造器,默认无参构造器消失。
record(Java 16+)自动生成构造器、equals/hashCode/toString,适合不可变数据载体。- 易错:面向对象新手常犯的错误是在构造器中调用可被重写的方法(如
this.someMethod())——此时子类构造器尚未执行完毕,可能导致空指针。构造器中只调用private/final方法。 - 思考任务:定义
Student类(name、score),用private封装score,通过setScore做 0~100 范围校验;再将其改写为record对比代码量。
下一节:内部类与嵌套类型
