社交媒体

类和对象

类和对象

钩子

上篇用外卖订单认识了对象,但那是我写好给你的。今天开始,你自己写类、自己造对象——这是你第一次从"用 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 执行就是李四。

14-类与对象关系图-MKlg.png

03 各造各的:对象之间互不干扰

s1.age = 21;
System.out.println(s2.age);   // 22,李四没被张三影响

每个对象在堆里有自己独立的空间,改张三的年龄,李四毫发无损。这正是和第 13 篇 o2 = o1 的区别:那次是两个变量指向一栋楼,这次是两栋不同的楼。

04 new 的时候,JVM 干了三件事

new Student() 这一行,背后是:

  1. 在堆里开辟一块空间,字段先放上默认值(String → null,int → 0,就是第 12 篇数组默认值的同款规矩);
  2. 执行初始化(下一篇《构造方法》的主角,今天先记有个环节);
  3. 把地址返回,交给 = 左边的变量。

所以"对象"从来不在变量里,变量里只有地址。类的信息(图纸)存在方法区,对象的数据(楼)存在堆里——记住这句,第 34 篇讲 JVM 内存时会回来谢我。


本文示例代码均已本地实测通过,可直接运行。
对应文件:StudentDemo.java


橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。