javaSE_8系列博客——Java语言的特性(三)--类和对象(9)--对象的创建

来源:互联网 发布:淘宝九一一正品折扣店 编辑:程序博客网 时间:2024/06/05 04:04

你知道,一个类提供了对象的蓝图;你从类创建一个对象。从CreateObjectDemo程序中获取的每个以下语句创建一个对象并将其分配给一个变量:

Point originOne = new Point(23, 94);Rectangle rectOne = new Rectangle(originOne, 100, 200);Rectangle rectTwo = new Rectangle(50, 100);

第一行创建Point类的对象,第二行和第三行每个都创建一个Rectangle类的对象。

这些语句有三个部分(下面详细讨论):

  1. 声明:粗体中设置的代码都是将变量名与对象类型相关联的变量声明。
  2. 实例化:new关键字是创建对象的Java运算符。
  3. 初始化:新的运算符后跟一个对构造函数的调用,该构造函数初始化新对象。

声明一个变量来引用对象

以前,你了解到要声明一个变量,你需要写:

type name;

这将通知编译器您将使用name来引用其类型为type的数据。使用原始变量,该声明还为变量保留适当的内存量。

您也可以在其自己的行上声明一个引用变量。例如:

Point originOne;

如果你这样声明originOne,它的值将不确定,直到对象被实际创建并分配给它。简单地声明一个引用变量不会创建一个对象。为此,您需要使用新的操作符,如下一节所述。在您的代码中使用它之前,必须将一个对象分配给originOne。否则,您将收到编译器错误。 在这种状态下,当前没有引用任何对象的变量可以说明如下(变量名,originOne,加上一个没有指向的引用):
这里写图片描述

对类进行实例化

New运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。New运算符也调用对象构造函数。

注意:“实例化一个类”这个短语意味着与“创建对象”相同。创建对象时,您正在创建一个类的“实例”,据此“实例化”一个类。

New运算符需要一个postfix参数:调用构造函数。构造函数的名称提供要实例化的类的名称。New操作符返回对它创建的对象的引用。此引用通常分配给适当类型的变量,如:

Point originOne = new Point(23, 94);

New操作符返回的引用不必分配给变量。它也可以直接在表达式中使用。例如:

int height = new Rectangle().height;

这个句子我们将会在下一个章节进行讨论。

初始化对象

下面是Point类的代码

public class Point{    private int x;    private int y;    public int GetX(){        return x;    }    public int GetY(){        return y;    }    public void SetX(int x){        this.x = x;    }    public void SetY(int y){        this.y = y;    }    public Point(int x,int y){        this.x = x;        this.y = y;    }}

这个类包含一个单一的构造函数。您可以识别一个构造函数,因为它的声明使用与该类名相同的名称,它没有返回类型。 Point类中的构造函数使用由代码(int x,int y)声明的两个整数参数。以下语句提供了23和94作为这些参数的值:

Point originOne = new Point(23, 94);

执行该语句的结果可以在下图中说明:
这里写图片描述

下面是Rectangle类的代码,包含了3个构造函数:

public class Rectangle{    private int width = 0;    public int GetWidth(){            return width;    }    public void SetWidth(int width){        this.width = width;    }    private int height = 0;    public int GetHeight(){        return height;    }    public void SetHeight(int height){        this.height = height;    }    public Point origin;    public Rectangle(){        origin = new Point(0,0);    }    public Rectangle(int width,int height){        SetWidth(width);        SetHeight(height);    }    public Rectangle(Point origin,int width,int height){        this.origin = origin;        SetWidth(width);        SetHeight(height);    }    public  int getArea(){        return width * height;    }    public void move(int x, int y ){        this.origin.SetX(x);        this.origin.SetY(y);    }}

每个构造函数允许您使用基本类型和引用类型来提供矩形的起点,宽度和高度的初始值。如果类有多个构造函数,则它们必须具有不同的签名。 Java编译器根据参数的数量和类型区分构造函数。当Java编译器遇到以下代码时,它知道要调用Rectangle类中的构造函数,它需要一个Point参数,后跟两个整数参数:

Rectangle rectOne = new Rectangle(originOne, 100, 200);

这调用Rectangle的构造函数,它将origin初始化为originOne。此外,构造函数将宽度设置为100,高度为200.现在有两个对同一个Point对象的引用 - 对象可以有多个引用,如下图所示:
这里写图片描述
以下代码行调用需要两个整数参数的Rectangle构造函数,它们为宽度和高度提供初始值。如果您检查构造函数中的代码,您将看到它创建一个新的Point对象,其x和y值初始化为0:

Rectangle rectTwo = new Rectangle(50, 100);

在以下语句中使用的Rectangle构造函数没有任何参数,所以它被称为无参数构造函数:

Rectangle rect = new Rectangle();

所有类都至少有一个构造函数。如果一个类没有明确声明任何,Java编译器会自动提供一个无参数的构造函数,称为默认构造函数。这个默认构造函数调用父类的无参构造函数,或者如果类没有其他父对象,则调用Object构造函数。如果父类没有构造函数(Object有一个),编译器将拒绝该程序。

0 0
原创粉丝点击