讲解
至此我们写的代码都塞在 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 指代当前对象。下一节学习把字段保护起来:封装与访问控制。