1. 什么是类和对象
先从一个类比开始。想象一张汽车的设计图。设计图上标明车有四个轮子、发动机、颜色、座椅等。但设计图本身不会在路上行驶、不会发出发动机的轰鸣,也不需要汽油。它只是关于汽车如何构成的描述。
类在编程中就像这样的“蓝图”(或模板),它定义了其实例将拥有哪些数据(字段)和行为(方法)。
对象就是根据这张蓝图“装配”的真实汽车,即具体的实例。每个对象都有自己的状态(例如,一辆车是红色,另一辆是蓝色)以及行为:每个对象都可以执行类中定义的动作(例如行驶、刹车、鸣笛)。
生活中的示例
- 类: 人 (Person) —— 描述一个人有姓名、年龄、身高,并且可以说话或跑步。
- 对象: 瓦夏、彼佳、卡佳 —— 具体的人,每个人都有自己的姓名和年龄。
| 类 | 对象 1 | 对象 2 |
|---|---|---|
|
|
|
为什么类很重要?
- 把相关的变量和方法组织在一起。
- 用相同的结构创建任意多个对象,但各自拥有不同的数据。
- 便于描述复杂实体:例如“银行账户”“商品”“图书”“用户”。
2. 类的声明语法
在 Java 中,类通过关键字 class 来声明。其后是类名(约定俗成——首字母大写),然后是花括号,字段和方法写在花括号内。
最简单的示例
public class Person {
// 这里将放置字段和方法
}
说明:
- public —— 访问修饰符。
- class —— 告诉编译器:“我在声明一个类”。
- Person —— 类名(自行设定,但首字母要大写)。
类命名的重要规则
- 类名应以大写字母开头(例如 Car、Account、Book)。
- 类名中不允许有空格和特殊字符,除了下划线和 $(但这种情况很少)。
- 如果名称由多个单词组成,使用 CamelCase 风格:BankAccount、BookStore。
类写在哪里?
类可以在单独的文件中声明(通常就是这样做:一个文件——一个类),也可以声明在另一个类的内部(关于嵌套类稍后再讲)。
例如,文件 Person.java:
public class Person {
// 字段和方法
}
3. 类的字段和方法(简述)
目前我们只声明了类,但它是空的——就像一个没有内容的盒子。我们来给它添加“属性”(字段)和“动作”(方法)。
字段(类内部的变量)
字段描述该类的每个对象将拥有哪些数据。
public class Person {
String name; // 人的名字
int age; // 年龄
}
方法(类内部的函数)
方法描述对象能做什么。
public class Person {
String name;
int age;
void sayHello() {
System.out.println("你好,我叫 " + name + "!");
}
}
说明:
- void —— 方法不返回任何值(关于返回值我们稍后讨论)。
- sayHello() —— 方法名,圆括号是必需的。
- 在方法内部可以访问类的字段(例如 name)。
4. 创建对象
现在——见证“魔法”!如何把蓝图变成“真实的汽车”?这就要用到关键字 new。
创建对象的语法
Person vasya = new Person();
- Person —— 变量的类型(我们的类)。
- vasya —— 变量名(可以任意取)。
- new Person() —— 创建一个新的 Person 类型对象。
现在我们有了变量 vasya,它指向一个 Person 类的对象。该对象拥有自己的字段和方法。
访问字段和方法
通过点号来访问字段和方法:
vasya.name = "瓦夏";
vasya.age = 25;
vasya.sayHello(); // 将输出:你好,我叫 瓦夏!
可以创建任意多个对象
Person petya = new Person();
petya.name = "彼佳";
petya.age = 30;
petya.sayHello(); // 你好,我叫 彼佳!
每个对象都是彼此独立的“副本”,拥有各自的数据。
5. 与前面主题的联系
在今天之前,我们一直把所有变量和方法直接写在带有 main 方法的类里,并没有考虑创建自己的类型。现在我们可以创建自己的“数据与函数容器”了。
这带来了巨大的可能性!你可以描述任务中出现的任何实体:客户、商品、账户、订单、动物、汽车——无所不包。程序会变得更加结构化、可读且可扩展。
示例:我们的第一个自定义类
让我们为一个小程序编写一个简单的类——比如“银行账户”(BankAccount)。我们会在课程进展中不断扩展这个示例。
public class BankAccount {
String owner; // 账户持有人
int balance; // 账户余额
void printInfo() {
System.out.println("持有人: " + owner + ", 余额: " + balance + " 欧元。");
}
}
现在在主方法 main 中(它仍然是运行程序所必需的)我们可以创建该类的对象:
public class Main {
public static void main(String[] args) {
BankAccount account1 = new BankAccount();
account1.owner = "伊万";
account1.balance = 1000;
account1.printInfo(); // 持有人: 伊万, 余额: 1000 欧元。
BankAccount account2 = new BankAccount();
account2.owner = "玛丽娅";
account2.balance = 2000;
account2.printInfo(); // 持有人: 玛丽娅, 余额: 2000 欧元。
}
}
请注意:每个对象都有自己的字段取值。如果你修改了 account1 的余额,这不会影响到 account2。
可视化示意:类与对象
graph TD
subgraph Class
Person["Class Person | name:String | age:int | sayHello()"]
end
subgraph Objects
vasya["vasya : Person | name = 'Vasya' | age = 20"]
petya["petya : Person | name = 'Petya' | age = 25"]
end
vasya --> Person
petya --> Person
说明:
- Person —— 类(模板)。
- vasya 和 petya —— 根据该模板创建的对象(实例)。
6. 声明类与创建对象时的常见错误
错误 1:类名以小写字母开头。
在 Java 中有这样的约定(编译器不会报错,但所有有经验的程序员都会“吐槽”!):类名应以大写字母开头。不要写 class person —— 要写 class Person。
错误 2:缺少花括号。
不要忘记,类体必须始终放在花括号中。
public class Person // 错误!
String name;
正确:
public class Person {
String name;
}
错误 3:未创建对象就尝试访问类的字段和方法。
如果方法或字段没有声明为 static,就只能通过对象来访问它们:
Person.sayHello(); // 错误!
正确:
Person vasya = new Person();
vasya.sayHello();
错误 4:文件名与类名不一致(针对 public 类)。
如果类被声明为 public,文件名必须与类名一致:
// 文件 Person.java
public class Person { ... }
如果文件名不同,编译器将报错。
错误 5:未初始化对象就使用类的实例字段。
类的字段(非 static)属于对象,而不是类本身。
GO TO FULL VERSION