56. Java 类和对象 - 创建对象
🎯 创建对象
在 Java 中,对象的创建是基于类的模版进行的。换句话说,类是对象的模板,而对象则是类的实例。让我们通过示例代码深入了解对象的创建过程。
🏗️ 创建对象的构造函数
让我们仔细看看 Point 和 Rectangle 类中的构造函数:
Point 类
public class Point {
public int x = 0;
public int y = 0;
// 构造函数
public Point(int a, int b) {
x = a;
y = b;
}
}
- 构造函数:与类名相同,没有返回类型。
- 作用:初始化新创建的对象,将
x和y赋值。
当执行以下代码时:
Point originOne = new Point(23, 94);
结果是创建一个 Point 对象,并将 x 设置为 23,y 设置为 94。
Rectangle 类
public class Rectangle {
public int width = 0;
public int height = 0;
public Point origin;
// 四个构造函数
public Rectangle() {
origin = new Point(0, 0);
}
public Rectangle(Point p) {
origin = p;
}
public Rectangle(int w, int h) {
origin = new Point(0, 0);
width = w;
height = h;
}
public Rectangle(Point p, int w, int h) {
origin = p;
width = w;
height = h;
}
public void move(int x, int y) {
origin.x = x;
origin.y = y;
}
public int getArea() {
return width * height;
}
}
✅ 构造函数的重载 (Overloading)
Rectangle 类有四个构造函数,让我们依次解析:
- 无参数构造函数
public Rectangle() {
origin = new Point(0, 0);
}
- 起点被初始化为 (
0, 0) - 宽度w和高度h保持默认值
0
- 带 Point 参数的构造函数
public Rectangle(Point p) {
origin = p;
}
- 起点由外部
Point对象决定 - 宽度和高度保持默认值
0
- 带宽高的构造函数
public Rectangle(int w, int h) {
origin = new Point(0, 0);
width = w;
height = h;
}
- 起点是 (
0, 0) - 宽度和高度分别由参数提供
- 带起点、宽、高的构造函数
public Rectangle(Point p, int w, int h) {
origin = p;
width = w;
height = h;
}
- 起点由参数
p决定 - 宽度和高度分别由参数提供
🎯 构造函数调用示例
Rectangle rectOne = new Rectangle(originOne, 100, 200);
这段代码调用的是带有 Point 和两个整数的构造函数,会执行以下初始化:
origin=originOne(23, 94)width=100height=200
另外,你也可以直接调用无参数构造函数:
Rectangle rect = new Rectangle();
如果没有显式定义构造函数,Java 会自动提供一个默认构造函数。但如果你定义了其他构造函数,默认构造函数就不会被自动生成。
🚀 对象的创建过程
我们从 CreateObjectDemo 程序中摘取了以下几行代码,这些语句分别创建了一个 Point 对象和两个 Rectangle 对象:
Point originOne = new Point(23, 94);
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Rectangle rectTwo = new Rectangle(50, 100);
每条语句都涉及三个步骤:
- 声明 (Declaration)
- 实例化 (Instantiation)
- 初始化 (Initialization)
让我们逐一拆解:
1️⃣ 声明
声明变量用于存储对象的引用。例如:
Point originOne;
这告诉编译器 originOne 是一个 Point 类型的变量,用于引用一个 Point 对象。然而,此时对象并没有真正被创建,仅仅是声明了变量。如果在对象创建之前尝试访问它的属性或方法,会导致编译错误。
2️⃣ 实例化
实例化是使用 new 关键字创建对象的过程。例如:
originOne = new Point(23, 94);
new 关键字会在内存中分配空间,并调用构造函数 (constructor) 来创建对象。
注意: 创建对象和实例化类是等价的,因为创建对象意味着创建类的实例。
3️⃣ 初始化
初始化是调用构造函数为新对象赋初始值的过程。例如:
new Point(23, 94)
这部分代码调用 Point 类的构造方法,将 x 和 y 分别初始化为 23 和 94。
整合在一起的完整语句是:
Point originOne = new Point(23, 94);
这是一次性完成声明、实例化和初始化的经典写法。
🏷️ 小结
创建对象时涉及三个步骤:
- 声明:指定变量类型
- 实例化:使用
new创建对象 - 初始化:调用构造函数赋初值
构造函数的关键点:
- 与类名相同,无返回类型
- 可以重载 (Overload)
- 如果没有显式定义,Java 会自动提供一个默认构造函数