钩子
上篇用外卖订单认识了对象,但那是我写好给你的。今天开始,你自己写类、自己造对象——这是你第一次从"用 Java"变成"写 Java"。
写完这篇,String、int[] 这些天天用的东西在你眼里会突然变透明:哦,原来你们就是这么造出来的。
01 写第一个类:图纸长这样
class Student {
// 字段:这类东西"有什么"
String name;
int age;
// 方法:这类东西"能干什么"
void introduce() {
System.out.println("我叫" + name + ",今年" + age + "岁");
}
}
一个类 = 字段(数据)+ 方法(行为)。这就是图纸的全部内容:规定 Student 这种东西必须有姓名、年龄,必须会自我介绍。
注意:图纸不是楼。这个 class 写完,内存里一个学生都没有——直到你 new。
02 new:造一栋楼
public class StudentDemo {
public static void main(String[] args) {
Student s1 = new Student(); // 造第一个学生
s1.name = "张三";
s1.age = 20;
s1.introduce(); // 我叫张三,今年20岁
Student s2 = new Student(); // 造第二个学生
s2.name = "李四";
s2.age = 22;
s2.introduce(); // 我叫李四,今年22岁
}
}
s1.introduce() 这个写法读作:"让 s1 这个对象执行 introduce"。方法是谁在执行?是对象自己。所以方法里的 name,执行的是"我自己的 name"——s1 执行就是张三,s2 执行就是李四。

03 各造各的:对象之间互不干扰
s1.age = 21;
System.out.println(s2.age); // 22,李四没被张三影响
每个对象在堆里有自己独立的空间,改张三的年龄,李四毫发无损。这正是和第 13 篇 o2 = o1 的区别:那次是两个变量指向一栋楼,这次是两栋不同的楼。
04 new 的时候,JVM 干了三件事
new Student() 这一行,背后是:
- 在堆里开辟一块空间,字段先放上默认值(String → null,int → 0,就是第 12 篇数组默认值的同款规矩);
- 执行初始化(下一篇《构造方法》的主角,今天先记有个环节);
- 把地址返回,交给 = 左边的变量。
所以"对象"从来不在变量里,变量里只有地址。类的信息(图纸)存在方法区,对象的数据(楼)存在堆里——记住这句,第 34 篇讲 JVM 内存时会回来谢我。
本文示例代码均已本地实测通过,可直接运行。
对应文件:StudentDemo.java
橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。