Skip to content
第 4 章 后端 ⏱ 12 分钟阅读

第 4 章:类与对象 ​

学习目标 ​

  • 掌握类的定义和对象的创建
  • 理解构造器和 this 关键字
  • 区分成员变量和局部变量
  • 避开空指针和构造器的常见坑

一、什么是类?什么是对象? ​

  • 类:模板,定义对象有什么字段、什么方法
  • 对象:类的具体实例,占用堆内存
java
// 类:模板
class Student {
    String name;             // 字段(成员变量)
    int age;

    void printInfo() {       // 方法
        System.out.println(name + ", " + age + "岁");
    }
}

// 对象:具体实例
Student s = new Student();  // ⚠️ 字段是默认值(name=null, age=0)
s.name = "张三";
s.age = 18;
s.printInfo();              // 张三, 18岁

二、构造器(创建对象时自动调用) ​

构造器特征:

  • 方法名 = 类名
  • 没有返回类型(连 void 都没有)
  • 用 new 触发,自动调用
java
class Student {
    String name;
    int age;

    public Student(String name, int age) {   // 有参构造器
        this.name = name;                    // ⚠️ this 区分字段和参数
        this.age = age;
    }
}

Student s = new Student("张三", 18);   // 自动调用构造器

⚠️ 坑 1:如果你没写任何构造器,编译器会自动生成一个无参的;但只要你写了任何构造器,编译器就不再生成了。

java
class User {
    public User(String name) { ... }   // 写了有参构造器
    // 编译器不再生成无参构造器
}
new User();    // ❌ 编译报错
new User("张三");  // ✅

企业建议:永远显式写一个无参构造器。

三、构造器重载 + this() 调用其他构造器 ​

java
class User {
    private String name;
    private int age;

    public User() {
        this("未命名", 0);                  // 调用其他构造器
    }

    public User(String name) {
        this(name, 0);
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

⚠️ 坑 2:this(...) 必须是构造器的第一行,否则编译报错。

四、成员变量 vs 局部变量 ​

维度成员变量局部变量
位置类体内方法 / 代码块内
默认值有(对象 null,数值 0)无(必须初始化)
内存堆(随对象)栈(随方法)
java
class User {
    private String name = "默认";        // 成员变量,有默认值

    public void register(String input) {  // input 是参数(局部变量)
        String password = "123456";       // 局部变量,必须初始化
        if (input != null) {
            String msg = "注册成功";      // 块局部变量,只在 if 内可见
        }
        // System.out.println(msg);       // ❌ 块外不可访问
    }
}

⚠️ 坑 3:局部变量必须显式初始化,否则编译报错 可能尚未初始化变量 X。

五、对象数组(注意先 new 再赋值) ​

java
Student[] students = new Student[3];   // ⚠️ 只创建 3 个 null 引用,还没 Student 对象!
students[0] = new Student("张三", 18);
students[1] = new Student("李四", 20);
students[2] = new Student("王五", 22);

for (Student s : students) {
    s.printInfo();
}

// students[0].printInfo();   // ❌ 没赋值就调用 → NullPointerException

六、本章小结 ​

要点关键
类 vs 对象类是模板,对象是实例
构造器方法名=类名,无返回类型,new 自动调用
this 关键字区分字段和参数,this() 调用其他构造器
成员变量有默认值,生命周期随对象
局部变量必须初始化,生命周期随方法
对象数组new Type[3] 只创建 null 引用,需逐个赋值

动手练习 ​

  1. Student 类:写 Student(String name, int age) 构造器,提供 printInfo() 方法
  2. 构造器重载:写 Book 类,有 3 个构造器(无参 / 只有书名 / 书名+作者)
  3. 封装用户:写 User 类,字段私有,setter 加非空校验

下一章:第 5 章:封装、static 与 final →

本站基于 VitePress 构建 · 由 StackHub 团队维护