1. 类的字段:对象状态存放在哪里
字段是声明在类内部、但在所有方法之外的变量。字段用于让每个对象都有自己的“状态”。例如,如果我们有类 Person,那么字段可以是:
- name — 人的名字
- age — 年龄
- balance — 账户余额(如果我们在做一个银行应用)
- isStudent — 标记此人是否为学生
字段声明语法
字段的声明类似于普通变量,只是它不在方法内部,而是直接位于类中:
public class Person {
String name;
int age;
}
这里我们声明了两个字段:字符串 name 和整型 age。每个字段都属于该类的具体对象。这意味着不同对象会有各自的取值。例如:
Person p1 = new Person();
p1.name = "奥莉娅";
p1.age = 20;
Person p2 = new Person();
p2.name = "伊戈尔";
p2.age = 25;
第一个对象的名字是“奥莉娅”,年龄是 20;第二个对象是“伊戈尔”,年龄是 25。它们都由同一个类创建,但它们的字段保存着不同的数据。
访问修饰符(public/private)
字段可以是公开的(public)或私有的(private)。现实生活中你不会把自己的银行余额告诉所有人,对吧?所以在编程中我们也常把字段设为 private,这样其他类就不能直接访问它们。这是封装原则的一部分(详细内容将在后续课程中介绍)。
示例:
public class Person {
private String name;
private int age;
}
暂时我们不做更多扩展,但请记住:如果字段是 private,就不能从其他类直接访问它。
2. 类的方法:对象“如何行动”
方法是描述对象行为的函数。方法让对象能够做事:说话、计算、奔跑、跳跃、输出自己的信息等等。
方法声明语法
return_type methodName(parameters) {
// 方法体
}
输出“你好”的方法示例:
public void sayHello() {
System.out.println("你好!我叫 " + name);
}
在这里:
- public — 访问修饰符。
- void — 方法不返回任何值(只是去做一件事)。
- sayHello — 方法名。
- 方法体中我们使用字段 name 来向用户打招呼。
再一个示例:返回年龄的方法
public int getAge() {
return age;
}
方法可以返回值(int、String 等),也可以什么都不返回——这种情况下写 void。
3. 构造器:对象是如何“诞生”的
构造器是创建新对象时被调用的特殊方法。它的任务是用初始值来初始化对象的字段,也就是把对象的“空口袋”填上具体数据。例如,可以在人被创建的那一刻就指定名字和年龄,而不是让它们保持为空。
- 构造器的名字总是与类名相同。
- 构造器没有返回类型(甚至不写 void)。
- 构造器可以带参数(例如名字和年龄),也可以不带参数。
构造器示例
public class Person {
String name;
int age;
// 带两个参数的构造器
public Person(String name, int age) {
this.name = name; // this.name — 对象的字段,name — 构造器的参数
this.age = age;
}
}
你可能会好奇 this 是什么。关键字 this 是对当前对象的引用(从对象内部看自己)。我们用它来区分与参数同名的字段。如果没有 this,编译器就会弄不清楚我们到底要初始化谁。
默认构造器
如果你没有声明任何构造器,Java 编译器会自动添加一个不带参数的空构造器。它看起来像这样:
public Person() {
// 什么也不做,但允许不带参数地创建对象
}
但是!如果你声明了至少一个自己的构造器(例如带参数的),那么默认构造器将不会被自动生成!如果你需要它——就显式写出来。
4. 一个完整类的示例
让我们把所有内容合在一起:字段、方法、构造器。
public class Person {
String name;
int age;
// 构造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 方法:打招呼
public void sayHello() {
System.out.println("你好!我叫 " + name + ",我 " + age + " 岁。");
}
// 方法:年龄加 1
public void haveBirthday() {
age = age + 1;
System.out.println("太棒了!我现在 " + age + " 岁了!");
}
}
在程序中如何使用?
public class Main {
public static void main(String[] args) {
Person user = new Person("瓦夏", 18);
user.sayHello(); // 你好!我叫 瓦夏,我 18 岁。
user.haveBirthday(); // 太棒了!我现在 19 岁了!
}
}
5. 实践:扩展你的应用
假设你在做一个简单的用户管理应用。上一节课我们只是在 main 里使用变量和方法。现在创建我们自己的类 User,包含字段、方法和构造器。
public class User {
String username;
int score;
// 构造器
public User(String username, int score) {
this.username = username;
this.score = score;
}
// 方法:输出用户信息
public void printInfo() {
System.out.println("用户名: " + username + ",积分: " + score);
}
// 方法:增加积分
public void addScore(int points) {
score += points;
System.out.println(username + " 获得了 " + points + " 分!他现在有 " + score + " 分。");
}
}
用法:
public class Main {
public static void main(String[] args) {
User alice = new User("Alice", 10);
User bob = new User("Bob", 5);
alice.printInfo(); // 用户名: Alice,积分: 10
bob.printInfo(); // 用户名: Bob,积分: 5
alice.addScore(7); // Alice 获得了 7 分!他现在有 17 分。
bob.addScore(3); // Bob 获得了 3 分!他现在有 8 分。
}
}
注意:每个对象都有自己的字段,一个对象的修改不会影响另一个。
6. 关于访问修饰符的简述
在我们的示例中,字段是公开的(String name;)。在实际开发中,往往把字段设为 private,以防止它们被其他类意外(或故意)修改。关于封装会在相关专题中详细讲解,先看这个示例:
public class User {
private String username;
private int score;
public User(String username, int score) {
this.username = username;
this.score = score;
}
public void printInfo() {
System.out.println("用户名: " + username + ",积分: " + score);
}
public void addScore(int points) {
score += points;
}
}
现在如果有人尝试在类外写 alice.score = 100500; —— 编译器会说“不可以!”。
7. 使用字段、方法和构造器时的常见错误
错误 1:未初始化的字段。
如果你不给字段赋值,它们会得到默认值:数字是 0,boolean 是 false,引用类型(例如 String)是 null。如果忘了初始化字段,可能会得到意外结果,甚至在尝试对它做某些操作时抛出 NullPointerException。
错误 2:混淆参数和字段。
在构造器里,新手常写成 name = name;——这并不会初始化字段,而只是让参数给自己赋值。一定要使用 this.name = name!
错误 3:缺少默认构造器。
如果你声明了带参数的构造器,却忘了显式添加无参构造器,那么 new Person() 将无法使用。
错误 4:把方法名和类名弄成一样。
在 Java 中,构造器的名字必须与类名相同,但方法的名字不应该相同。有时会误把方法命名得和类一样,编译器就会报错。
错误 5:忽略访问修饰符。
如果把字段设为 public,那么它们可以在任何地方被修改——这对大型程序来说很危险。最好从一开始就习惯使用 private,并通过方法来进行访问。
GO TO FULL VERSION