3.6 构造方法与new关键字

img

扫码看视频

当对象被创建之后,我们会设置对象的一些字段或者调用一些方法,目的是让对象能够进入工作状态。就如同你买了一台电视,需要进行一些初始化设置,将你喜欢看的各个电视台搜索出来,调整一些画面、亮度、声音等设置。

在代码3.3中,我们为Point类定义了一个init方法,该方法用于在Point对象创建后,对点的两个坐标值进行初始化。然而现实中也有一些对象是在创建后即可使用的,比如你买的手机,在手机开机后即可正常使用,里面还预装了一些必备和常用的手机软件。在代码3.3中,在Point对象创建之后,我们通过调用init方法对该对象进行初始化,那么能不能在Point对象创建的同时就完成初始化工作呢?毕竟这样还可以避免用户一时疏忽而忘记调用init方法。在Java中,为我们提供了一种构造方法(Constructor,也称为构造器)来进行对象的初始化。

构造方法的名称与类名相同,并且没有返回值。

代码3.6中为Point类定义了一个构造方法Point。

img

程序的输出结果是:

img

注意粗体显示的Point方法就是构造方法,在该方法中,我们对Point类的成员变量x和y进行了初始化。在main方法中,使用new关键字构造一个Point类的对象,这将引起Point类的构造方法的调用,从而对x和y字段进行初始化,最终调用pt.show()输出5和3。

要注意的是,在定义构造方法时,方法名前面不要添加任何的类型说明符,构造方法不返回任何结果。这与没有返回值的普通方法不同,一个方法即使不需要返回值,也必须使用void这种空类型说明符来修饰。如果你给一个构造方法添加了类型说明符,那么该方法就会被视为一个普通方法。例如,代码3.7给Point方法名前面添加了void关键字。

img
img

最终程序的输出结果是:

img

这是因为Java编译器将Point方法当成了普通方法,虽然该方法很奇怪,但是一个合法的普通方法,在构造Point类的对象时,这个普通方法并未被调用,因此输出结果是0和0。

构造方法主要用于为类的对象定义初始化状态。我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。

在构造对象时,new关键字有三个作用:

● 为对象分配内存空间

● 引起对象构造方法的调用

● 为对象返回一个引用

Java的类都要求有构造方法,如果没有定义构造方法,Java编译器就会为我们提供一个默认的构造方法,它不接受任何参数。在Java的官方文档中,这个构造方法叫无参数构造方法。不过当我们定义了一个构造方法之后,Java编译器就不会再提供默认构造方法了。

默认的构造方法对对象的数据成员也会进行初始化,Java编译器会用默认值来初始化对象的数据成员,不同数据类型的默认值是不一样的,表3-1列出了各种数据类型的默认值。

表3-1 各种数据类型的默认值

img

这也是为什么代码3.7的输出结果是0和0的原因,Point方法错误地添加了void关键字,从而被Java编译器认为是普通方法,在构造Point类的对象时,调用的是Java编译器为Point类提供的默认构造方法,x和y是int类型,用默认值0进行初始化。