主题
Chapter 07 · 类与对象(OOP 入门)
Java 的灵魂在这里 — 把现实世界"翻译"成代码。
🎯 本章目标
- 理解 类 vs 对象 的关系(图纸 vs 房子)
- 学会定义类、创建对象、访问属性和方法
- 掌握 this 关键字 的两种用法
- 理解 栈 vs 堆 内存分配
- 知道什么是 构造器 入门
1. 类与对象:图纸和房子的故事
想象建筑工地:
| 概念 | 类比 | Java 中 |
|---|---|---|
| 设计图纸 | 描述什么是房子 | 类(class) |
| 实际盖出来的房子 | 一栋具体的房子 | 对象(object / instance) |
| 房子的属性 | 几室几厅、面积、颜色 | 类的 字段(field / 属性) |
| 房子能做什么 | 开门、关窗、亮灯 | 类的 方法(method) |
一张图纸可以盖很多栋房子:每栋房子结构相同(都是三室两厅),但细节不同(颜色、户主)。
java
class House { // 图纸(类)
String color; // 属性
int rooms;
void openDoor() { // 方法
System.out.println("门开了");
}
}
House h1 = new House(); // 第 1 栋房子
h1.color = "白色";
h1.rooms = 3;
House h2 = new House(); // 第 2 栋房子
h2.color = "蓝色";
h2.rooms = 4;2. 定义一个类
Java 类的标准结构:
java
public class Student {
String name; // 字段(成员变量)
int age;
double score;
void study(String subject) { // 方法
System.out.println(name + " 正在学习 " + subject);
}
void printInfo() {
System.out.println("姓名: " + name + ", 年龄: " + age);
}
}惯例:
- 类名 大驼峰(
Student、UserAccount) - 字段、方法名 小驼峰(
firstName、getAge) - 一个
.java文件最多一个 public 类,文件名与类名一致
3. 创建对象:new 关键字
java
Student s = new Student(); // 创建对象,s 是引用
s.name = "张三";
s.age = 20;
s.score = 95.5;
s.study("Java");
s.printInfo();内存模型
栈(Stack) 堆(Heap)
───────────── ─────────────
s ────────────────► Student 对象
name: "张三"
age: 20
score: 95.5关键点:
- 变量
s在栈上,存的是堆中对象的 地址 new在堆上分配空间s.name实际是"通过 s 找到对象,再访问 name"
4. 字段的默认值
类的字段(成员变量)有默认初始值(局部变量没有):
| 类型 | 默认值 |
|---|---|
| 数值(int/double 等) | 0 / 0.0 |
| 布尔 boolean | false |
| 字符 char | \u0000 |
| 引用类型 | null |
java
class Box {
int count; // 默认 0
String label; // 默认 null
boolean open; // 默认 false
}
Box b = new Box();
System.out.println(b.count); // 0
System.out.println(b.label); // null5. this 关键字
this = "当前对象自己",主要两种用法:
5.1 区分字段和参数(最常见)
java
class Student {
String name;
void setName(String name) { // 形参 name 与字段 name 同名
this.name = name; // this.name 是字段,name 是参数
}
}💡 没有
this,编译器会以为你在自己赋值给自己。
5.2 在构造器中调用其他构造器
java
class Point {
int x, y;
Point() {
this(0, 0); // 调用下面那个构造器
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
}6. 构造器(Constructor)入门
构造器是 造对象时自动调用的特殊方法,用来初始化字段。
java
class Student {
String name;
int age;
Student(String name, int age) { // 构造器:与类同名,无返回类型
this.name = name;
this.age = age;
}
}
Student s = new Student("张三", 20); // 直接传值初始化默认构造器
如果你 没写任何构造器,编译器会自动给你一个无参的:
java
class Empty {
// 编译器自动加:Empty() {}
}但只要你写了 任何一个构造器,默认的就没了。
java
class Student {
Student(String n) {} // 自定义了
}
new Student(); // ❌ 编译错误:找不到无参构造器📚 构造器是大话题,下一章 Chapter 08 还会深入讲。
7. 一个完整例子:建模一只小狗
java
public class Dog {
String name;
String breed;
int age;
double weight;
Dog(String name, String breed, int age, double weight) {
this.name = name;
this.breed = breed;
this.age = age;
this.weight = weight;
}
void bark() {
System.out.println(name + ": 汪汪!");
}
void eat(String food) {
System.out.println(name + " 在吃 " + food);
weight += 0.1;
}
void printInfo() {
System.out.printf("%s [品种=%s, 年龄=%d岁, 体重=%.2fkg]%n",
name, breed, age, weight);
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog("旺财", "金毛", 3, 25.5);
Dog d2 = new Dog("豆豆", "柯基", 1, 12.0);
d1.bark();
d1.eat("狗粮");
d1.printInfo();
d2.bark();
d2.printInfo();
}
}8. 实战练习
| 文件 | 内容 |
|---|---|
Student.java | 学生类基础 |
Dog.java | 完整建模实战 |
Point.java | this 与构造器互调 |
9. 浏览器演示
打开 demo.html 体验:
- 类与对象关系图
- 创建多个对象的内存可视化
10. 面试可能会问什么?
Q1: 类和对象有什么区别?
- 类:抽象的模板,描述"什么"。只有一个。
- 对象:类的具体实例,可以有很多个,每个对象有独立的状态。
Q2: 为什么要用 this?
- 区分字段和同名参数
- 调用同一类的其他构造器(必须放第一行)
- 链式调用(
return this)
Q3: 字段的默认值和局部变量有什么区别?
- 字段(类内):自动初始化为默认值
- 局部变量(方法内):必须手动赋值,否则编译错
java
class A {
int x; // 自动 = 0
void m() {
int y;
System.out.println(y); // ❌ 必须赋值
}
}Q4: 一个类能定义多少个对象?
答:理论上不限,受堆内存限制。每次 new 都创建一个新对象,地址不同。
Q5: 对象不再使用时怎么释放?
答:Java 有 垃圾回收(GC),没有引用指向对象时,GC 会自动回收。不需要手动 delete(不像 C++)。
Q6: 构造器和普通方法的区别?
| 对比 | 构造器 | 普通方法 |
|---|---|---|
| 名字 | 必须与类同名 | 自定义 |
| 返回类型 | 无(连 void 都不写) | 必须写 |
| 调用 | new 时自动调 | 主动调 |
| 用途 | 初始化对象 | 业务逻辑 |
🎁 本章小结
✅ 类是图纸(描述结构),对象是实例(具体存在)
✅ new 关键字在堆上创建对象,栈中存引用
✅ 字段有默认值,局部变量必须手动初始化
✅ this 指当前对象,区分同名字段/参数
✅ 构造器初始化对象,与类同名、无返回值🔗 导航
- ⬅️ 上一章:Chapter 06 · 方法
- ➡️ 下一章:Chapter 08 · 封装与构造器