创建对象
如你所知,类提供了对象的蓝图/模板;你可以通过类创建对象。下面的每一个语句取自 CreateObjectDemo
,都创建了一个对象并将它赋值给一个变量:
|
|
第一行创建了一个 Point
类的对象,第二行及第三行创建了 Rectangle
类的对象.
每一行语句都包含了三部分,详情如下:
- 声明Declaration: 首先定义了变量对应的数据类型和变量名.
- 实例化Instantiation:
new
关键字时Java的创建(实例化)对象操作符. - 初始化Initialization:
new
操作符接下来调用一个构造方法,构造方法初始化这个新的对象.
定义一个引用对象的变量
首先你,学到了如何声明一个变量,这样写:
|
|
这么做就告诉了编译器你将使用name
指向/引用类型为type
的数据。作为基本数据变量,这个声明同样会为变量预备/分配适当数量的内存。
你同样可以定义一个引用类型的变量,例如:
|
|
如果你向这样声明 originOne
变量,它的值时不确定的,直到你个对象确实创建并赋值给它。简单的声明一个引用类型的变量并不会创建一个对象。因此,你需要使用new
操作符,就像上一节讲的。在你的代码中使用它之前你必须创建一个对象并赋值给它。不然的话,就会出现一个编译错误。
在现在的这种情况下,当前的变量时么有引用对象的,示例如下(变量名,originOne
,没有指向任何东西):
实例化一个类Instantiating a Class
new
操作符实例化一个 类,通过为新的对象分配一块内存并返回指向这块内存的引用。new
操作符同样调用了类的构造方法。
注意: 单词 “instantiating a class” 实例化一个类与 “creating an object.”创建一个对象意思一样。当你创建你对象的时候,你创建一个类的实例,或者说实例化一个类。
new
操作符要求一个单独的后缀参数:一个构造函数的调用.构造函数名提供了需要实例化的类名。
new
操作符返回一个它创建的对象的引用。这个引用通常赋值给一个对应类型的变量。就像这样:
|
|
new
操作符返回的引用并不一样非要复制给一个变量,它也可以直接在一个表达式中使用。例如:
|
|
下一节还会讨论这个语句。
初始化一个对象Initializing an Object
以下为Point
类的代码:
|
|
这个类包含唯一的构造方法。你很容易识别构造方法,因为它的名字与类名一样并且没有返回类型。Point
类的构造方法需要两个integer
参数 (int a, int b)
.下面的语句提供了23和94作为这两个参数的值:
|
|
语句执行的结果可以用以下图例展示:
下面是矩形Rectangle
类的代码,包含了四个够高方法:
|
|
每一个构造方法让你使用基本数据类型或者引用类型为矩形的定点,宽,高提供初始值。如果你个类有多个构造方法,它们必须有不同 的方法签名。Java编译器根据参数的类型和数量来区分构造函数。当Java编译其碰到虾米那的代码,它直到去调用要求Point
,以及两个整数参数的构造方法:
|
|
这个方法调用初始化origin
为originOne
,同样设置width
为100,height
为200。现在有两个引用指向同一个 Point object
—一个对象可以有多个引用指向它,就像下面的图例所示:
接下来的几行代码调用了要求两个integer
整形参数的构造方法,为width
和height
提供了初始值。观察这个构造方法的代码,你会发现它创建了一个新的Point
对象,其x
,y
的值初始化为0:
|
|
Rectangle
构造方法使用了下面的语句,没有用到参数,因此叫做无参构造器, no-argument constructor:
|
|
所有的类都至少有一个构造器。如果类没有像是的提供构造其,Java编译器为自动提供一个无参构造器,叫做默认构造器 default constructor. 这个默认构造器调用父类的无参构造器,如果这个类没有其他父类则调用Object
的构造器。如果这个父类没有构造器(Object
有构造器),编译器将会拒绝这个程序。