Skip to content

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);
    }
}

惯例

  • 类名 大驼峰StudentUserAccount
  • 字段、方法名 小驼峰firstNamegetAge
  • 一个 .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
布尔 booleanfalse
字符 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);  // null

5. 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.javathis 与构造器互调

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 指当前对象,区分同名字段/参数
✅ 构造器初始化对象,与类同名、无返回值

🔗 导航