0
点赞
收藏
分享

微信扫一扫

第四章《类与对象》第4节:构造方法

​创建一个Person类对象要用如下代码实现:

Person p = new Person();​

在这段代码中,new关键字后面的Person()其实也是一个方法,这个方法在专业上叫做“构造方法”。语言中创建一个对象都要通过以下格式完成:​

new 构造方法(参数);

构造方法是用来创建对象的特殊方法,它有2个很显著的特点:首先,构造方法名称与类的名称相同。其次,构造方法的前面不能声明返回值类型,即便是void也不行。​

有读者会问:在定义Person类的时候并没有在类中定义构造方法,那么Person()这个构造方法是从哪里来的呢?Java语言中,如果程序员没有在类中定义构造方法,那么编译器会在编译阶段为这个类添加一个默认的构造方法。但是如果程序员在类中自己定义了构造方法,那么编译器就不再为这个类添加构造方法。编译器所添加的默认构造方法是一个没有参数的空构造方法,其形式如下:​

类名(){

}

可以看到:默认的构造方法中不包含任何语句,那么这个空的构造方法的存在有什么意义呢?因为创建对象都要调用构造方法完成,所以,为了使每一个类都能够创建出对象,就要求这个类中要至少存在一个构造方法可以被调用。这个空的构造方法仅仅是为了保证在创建对象时,类当中存在一个可以被调用的构造方法。​

构造方法还有一个很重要的作用就是初始化对象的内部状态。初始化对象的内部状态就是在创建对象时为对象的各个属性赋上初始值。使用编译器提供的默认构造方法虽然也能创建对象,但它并不能为对象的各个属性设置初始值。如果希望在创建对象时为对象的各个属性设置指定的初始值,就必须由程序员自己动手来定义一个带有参数的构造方法,并且在这个构造方法中完成设置对象属性初始值的操作,例如:​

Person(String n ,char s ,int a){​
name = n; //初始化name属性​
sex = s; //初始化sex属性​
age = a; //初始化age属性​
}​

以上构造方法有3个参数,这3个参数的值分别赋给了name、sex和age。此处的name、sex和age就是Person类的3个属性。定义在类中的属性可以被该类的任意一个方法直接访问,因此在构造方法中可以直接为name、sex和age这三个属性赋值,而程序员就能通过这样的构造方法创建出自己期望的对象。例如,程序员期望创建一个对象,这个对象表示一个姓名为张三、性别为男性、年龄为20岁的人,就可以用如下代码实现:​

Person p = new Person("张三",'男',20);​

通过调用这个有3个参数的构造方法,虚拟机可以创建出一个对象,并且在创建对象的同时就把”张三”、’男’、20这三个值分别赋给name、sex和age这三个属性。反之,如果类中没有定义这个带有3个参数的构造方法,想要创建出一个相同属性的对象,只能通过如下代码实现: ​

Person p = new Person();​
p.name = "张三";​
p.sex = '男';​
p.age = 20;​

可以很明显的看到:通过这样的方式创建对象不能“一步到位”的设置各个属性的初始值,并且代码量也增加了不少。​

有的时候,程序员员并不需要在创建对象时给所有的属性都赋上初始值,在这种情况下就可以定义初始化部分属性的构造方法。例如:​

Person(String n ,char s){​
name = n; //初始化name属性​
sex = s; //初始化sex属性​
}​

以上定义的构造方法只有2个参数,通过这两个参数为对象的name和sex两个属性设置初始值。程序员在开发过程中可以根据实际需要选择不同参数的构造方法创建对象,而这些不同参数的构造方法就形成了重载关系。​

使用默认的无参数构造方法创建出的对象是千篇一律的,而通过程序员自定义的带有参数的构造方法则可以创建出形态各异的对象。所以大多数情况下,程序员在创建一个类之后都会专门为这个类定义带有参数的构造方法以便能在创建对象时就能够设置其属性的初始值。​

前文讲过,如果程序员在类当中自己定义了一个构造方法,那么编译器将不再为该类添加无参数的构造方法,所以当在Person类中定义了带参数的构造方法后,Person类中就没有无参数的构造方法了,这会导致【例04_01】和【例04_02】中的语句“Person p = new Person();”会因无法调用到Person()这个构造方法而出现语法错误。解决这个错误的最简单办法就是再在Person类中手动添加一个无参数的空构造方法,形式如下:​

Person(){​
}​

有读者会问:构造方法的名称与类名相同,那么普通方法的名称是否可以与类名相同呢?如果可以的话,如何辨别这个方法是普通方法还是构造方法呢?​

普通方法的名称完全可以与类名相同,无论是程序员还是编译器,判断一个与类名称相同的方法到底是构造方法还是普通方法,只需要看这个方法前面是否声明了返回值类型,如果这个方法前面没有声明任何返回值类型,那么它就是一个构造方法,否则它就是一个普通方法。

除此文字版教程外,小伙伴们还可以​​点击这里​​观看我在本站的视频课程学习Java。

举报

相关推荐

0 条评论