56. Java 类和对象 - 创建对象

175 阅读4分钟

56. Java 类和对象 - 创建对象

🎯 创建对象

在 Java 中,对象的创建是基于类的模版进行的。换句话说,类是对象的模板,而对象则是类的实例。让我们通过示例代码深入了解对象的创建过程。


🏗️ 创建对象的构造函数

让我们仔细看看 PointRectangle 类中的构造函数:

Point 类

public class Point {
    public int x = 0;
    public int y = 0;

    // 构造函数
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}
  • 构造函数:与类名相同,没有返回类型。
  • 作用:初始化新创建的对象,将 xy 赋值。

当执行以下代码时:

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 类有四个构造函数,让我们依次解析:

  1. 无参数构造函数
public Rectangle() {
    origin = new Point(0, 0);
}
  • 起点被初始化为 (0, 0)
  • 宽度w和高度h保持默认值 0
  1. 带 Point 参数的构造函数
public Rectangle(Point p) {
    origin = p;
}
  • 起点由外部 Point 对象决定
  • 宽度和高度保持默认值 0
  1. 带宽高的构造函数
public Rectangle(int w, int h) {
    origin = new Point(0, 0);
    width = w;
    height = h;
}
  • 起点是 (0, 0)
  • 宽度和高度分别由参数提供
  1. 带起点、宽、高的构造函数
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 = 100
  • height = 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);

每条语句都涉及三个步骤

  1. 声明 (Declaration)
  2. 实例化 (Instantiation)
  3. 初始化 (Initialization)

让我们逐一拆解:

1️⃣ 声明

声明变量用于存储对象的引用。例如:

Point originOne;

这告诉编译器 originOne 是一个 Point 类型的变量,用于引用一个 Point 对象。然而,此时对象并没有真正被创建,仅仅是声明了变量。如果在对象创建之前尝试访问它的属性或方法,会导致编译错误。

2️⃣ 实例化

实例化是使用 new 关键字创建对象的过程。例如:

originOne = new Point(23, 94);

new 关键字会在内存中分配空间,并调用构造函数 (constructor) 来创建对象。

注意: 创建对象和实例化类是等价的,因为创建对象意味着创建类的实例。

3️⃣ 初始化

初始化是调用构造函数为新对象赋初始值的过程。例如:

new Point(23, 94)

这部分代码调用 Point 类的构造方法,将 xy 分别初始化为 23 和 94。

整合在一起的完整语句是:

Point originOne = new Point(23, 94);

这是一次性完成声明实例化初始化的经典写法。


🏷️ 小结

创建对象时涉及三个步骤:

  1. 声明:指定变量类型
  2. 实例化:使用 new 创建对象
  3. 初始化:调用构造函数赋初值

构造函数的关键点:

  • 与类名相同,无返回类型
  • 可以重载 (Overload)
  • 如果没有显式定义,Java 会自动提供一个默认构造函数