讲解

至此我们写的代码都塞在 main 里,这只是权宜之计。Java 的正统世界观是面向对象:类(class)是图纸,描述一类事物「有什么数据」和「能做什么」;对象(object)是按图纸造出来的具体实例。一张 Person 图纸可以造出张三、李四无数个对象,各自的数据互不相干。类里的数据叫字段(field),类里的函数叫方法(method),二者共同构成类的成员。

定义一个类就是列出它的字段和方法:class Person 里有 String name、int age 两个字段,和 introduce() 一个方法。用 new Person() 造出对象,点号访问成员:p.name = "张三"; p.introduce();。方法里出现的 this 指代「当前这个对象」,当参数名和字段名撞车时用 this.name 明确表示字段。方法里没有 static 修饰的就是「实例方法」,它总是作用在某个具体对象上,能通过 this 拿到对象自己的数据。

构造方法(constructor)是创建对象时自动执行的特殊方法:名字与类名相同、不写返回类型。new Person("张三", 20) 会在造对象的同时把初始数据装进去,避免「先造个空对象再一个个塞字段」的两步操作。一个类可以写多个构造方法(重载),参数不同对应不同的初始化方式;如果你不写任何构造方法,编译器会自动补一个无参的;一旦你写了带参的,那个免费的无参版本就消失了,需要的话得自己显式写出来。

示例

定义 Person 类(字段、构造方法、实例方法),造两个对象分别使用:

class Person {
    String name;
    int age;

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

    void introduce() {
        System.out.println("我叫 " + this.name + ",今年 " + this.age + " 岁");
    }

    void haveBirthday() {
        this.age++;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 20);
        Person p2 = new Person("李四", 25);
        p1.introduce();
        p2.introduce();
        p1.haveBirthday();
        p1.introduce();
    }
}

构造方法重载:给未知姓名的用户一个默认初始化路径:

class Account {
    String owner;
    double balance;

    Account(String owner) {
        this.owner = owner;
        this.balance = 0.0;
    }

    Account(String owner, double balance) {
        this.owner = owner;
        this.balance = balance;
    }

    void deposit(double amount) {
        if (amount > 0) {
            this.balance += amount;
        }
    }

    void printBalance() {
        System.out.println(this.owner + " 的余额:" + this.balance);
    }
}

public class Main {
    public static void main(String[] args) {
        Account a = new Account("王芳");
        Account b = new Account("赵磊", 100.0);
        a.deposit(50);
        b.deposit(20);
        a.printBalance();
        b.printBalance();
    }
}

常见坑

  • 字段名与参数名撞车后写 name = name:两边都指参数,字段根本没被赋值,这就是 this 存在的意义。构造方法里赋值养成 this.字段 = 参数 的习惯。
  • 写了带参构造后 new 无参对象报错:编译器只在「你没写任何构造方法」时才送无参版本。需要无参构造就自己补一个。
  • 在静态方法里直接用实例字段:static 方法不属于任何对象,没有 this,直接访问 name 会编译报错。实例数据要在实例方法里用,或通过对象点出来。
  • 把对象当基本类型比较和复制:Person p2 = p1; 只是复制了引用,两个变量指向同一个对象,改一个另一个跟着变。理解「引用」是理解 Java 内存行为的关键。

小结

类是图纸、对象是实例,字段存数据、方法管行为;构造方法在 new 时初始化对象,this 指代当前对象。下一节学习把字段保护起来:封装与访问控制。