![Java无难事:详解Java编程核心思想与技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/35011059/b_35011059.jpg)
3.6 构造方法与new关键字
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_22.jpg?sign=1738883934-yreMBxFkhlHudmzfqU9iFJgSsDAUgrOT-0-de607bc8790ec3681010d4b2e191ad4d)
扫码看视频
当对象被创建之后,我们会设置对象的一些字段或者调用一些方法,目的是让对象能够进入工作状态。就如同你买了一台电视,需要进行一些初始化设置,将你喜欢看的各个电视台搜索出来,调整一些画面、亮度、声音等设置。
在代码3.3中,我们为Point类定义了一个init方法,该方法用于在Point对象创建后,对点的两个坐标值进行初始化。然而现实中也有一些对象是在创建后即可使用的,比如你买的手机,在手机开机后即可正常使用,里面还预装了一些必备和常用的手机软件。在代码3.3中,在Point对象创建之后,我们通过调用init方法对该对象进行初始化,那么能不能在Point对象创建的同时就完成初始化工作呢?毕竟这样还可以避免用户一时疏忽而忘记调用init方法。在Java中,为我们提供了一种构造方法(Constructor,也称为构造器)来进行对象的初始化。
构造方法的名称与类名相同,并且没有返回值。
代码3.6中为Point类定义了一个构造方法Point。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_23.jpg?sign=1738883934-VFVVaMAlw9ZVpsrea8Ri0BYoH3ErwQ2k-0-2c451315493a8fe810fb5c905daf158f)
程序的输出结果是:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_24.jpg?sign=1738883934-Sl1mTTFheEfnO6p0iIfZFkiOcKa3Q46P-0-5506dd3b9245e7fafd2e7f3bb9d0d107)
注意粗体显示的Point方法就是构造方法,在该方法中,我们对Point类的成员变量x和y进行了初始化。在main方法中,使用new关键字构造一个Point类的对象,这将引起Point类的构造方法的调用,从而对x和y字段进行初始化,最终调用pt.show()输出5和3。
要注意的是,在定义构造方法时,方法名前面不要添加任何的类型说明符,构造方法不返回任何结果。这与没有返回值的普通方法不同,一个方法即使不需要返回值,也必须使用void这种空类型说明符来修饰。如果你给一个构造方法添加了类型说明符,那么该方法就会被视为一个普通方法。例如,代码3.7给Point方法名前面添加了void关键字。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_25.jpg?sign=1738883934-l5sbf8TGGJIWjZs70LVfVVblNmEbslM3-0-4308680a570473845b67ce5366bf6269)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_26.jpg?sign=1738883934-1gRyHSxZFQ8V4xAp6gllqSgq6LU51Qdc-0-d6f9397d019ca77eb315671880e40df6)
最终程序的输出结果是:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_27.jpg?sign=1738883934-N0raP3xdjieuHoCWsepAWzYQzSNzQXeY-0-3353f7feb7ca61e1f6e4e5721b226585)
这是因为Java编译器将Point方法当成了普通方法,虽然该方法很奇怪,但是一个合法的普通方法,在构造Point类的对象时,这个普通方法并未被调用,因此输出结果是0和0。
构造方法主要用于为类的对象定义初始化状态。我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。
在构造对象时,new关键字有三个作用:
● 为对象分配内存空间
● 引起对象构造方法的调用
● 为对象返回一个引用
Java的类都要求有构造方法,如果没有定义构造方法,Java编译器就会为我们提供一个默认的构造方法,它不接受任何参数。在Java的官方文档中,这个构造方法叫无参数构造方法。不过当我们定义了一个构造方法之后,Java编译器就不会再提供默认构造方法了。
默认的构造方法对对象的数据成员也会进行初始化,Java编译器会用默认值来初始化对象的数据成员,不同数据类型的默认值是不一样的,表3-1列出了各种数据类型的默认值。
表3-1 各种数据类型的默认值
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_28.jpg?sign=1738883934-jd2qx9D2GlOoaD2Tuwr5Qqb0Y42IsR1V-0-101ab0c203ffd5c645d59a3b8e61a1b6)
这也是为什么代码3.7的输出结果是0和0的原因,Point方法错误地添加了void关键字,从而被Java编译器认为是普通方法,在构造Point类的对象时,调用的是Java编译器为Point类提供的默认构造方法,x和y是int类型,用默认值0进行初始化。