第 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:如果你没写任何构造器,编译器会自动生成一个无参的;但只要你写了任何构造器,编译器就不再生成了。
javaclass 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 引用,需逐个赋值 |
动手练习
- Student 类:写
Student(String name, int age)构造器,提供printInfo()方法 - 构造器重载:写
Book类,有 3 个构造器(无参 / 只有书名 / 书名+作者) - 封装用户:写
User类,字段私有,setter 加非空校验
下一章:第 5 章:封装、static 与 final →