构造方法的使用

构造方法

构造方法是类中一种特殊的方法,它一般由系统在创建对象(即类实例化)时自动调用。构造方法是对象中第一个被
执行的方法,主要用于申请内存、对类的成员变量进行初始化等操作。构造方法虽然也位于类里面,但在很多情况下
与普通成员方法表现不同,所以也有人认为它不是成员方法,而且将其称为“构造器”。构造方法的一般形式为:
构造方法名([参数列表]){
  [this([参数列表]);] |[super([参数列表]);]
  语句序列
}
其中,this是调用其他的构造方法,super是调用父类的构造方法。它们都必须放在其他语句的前面。
编写式构造方法要注意以下几点:

 1. 构造方法的名字必须和类的名字完全相同。
 2. 除了访问权修饰符之外,不能有其他任何修饰符,也就不能有返回值。
 3. 尽管没有返回值,但并不能用“void”修饰。
 4. 构造方法不能用static和final来修饰。一般也不用private修饰,这会导致无法在外部创建对象。
 5. 构造方法不能由对象显式地调用。一般通过new关键字来调用,或者用this、super来调用。
 6. this()和super()不能同时存在
 7. 构造方法的参数列表可以为空,也可以有参数。根据参数的有无,分为无参数的构造方法和带参数的构造方法。
 8. 用户定义的类可以拥有多个构造方法,但要求参数列表不同。
 9. 如果用户定义的类未提供任何构造方法时,系统会自动为其提供一个无参数的构造方法。

1、无参数构造方法的定义和使用

无参数的构造方法示例:
在这里插入图片描述

调用构造方法使用的是“new Animal()”,这是一种隐式的调用方法。注意到成员变量,它在定义的时候已经赋了初
值。在构造方法中,先是输出一条信息,然后再次为x赋值。由于构造方法的执行在定义成员变量之后,它会覆盖掉
原来的初值,所以变量的值为100。

如果我们在构造方法前加上“void”会变成下面这个样子:
在这里插入图片描述

输出的结果却是变量的初值,说明我们定义的无参构造方法根本没有执行。这是因为加上“void”修饰符之后,
constructNoPara()不再是一个构造方法,而成了一个普通方法。而我们调用的是系统自己提供的默认的无参构造方
法。
//系统自己提供的默认的无参构造方法
public Animal() {
}
//这个方法其实什么事情也没做,自然也就不会更改x的值。

2、带参数构造方法的定义和使用

在很多时候,需要根据不同的情况为成员变量赋不同的初值,这就需要传递参数给构造方法。因此,Java中允许定
义带参数的构造方法,而且这种带参数的构造方法还可以定义多个(前提是参数列表有区别)这种现象被称为构造方
法的重载。

Java规定,如果程序员一个构造方法都不定义,那么系统会自动为其加上一个不带参数的构造方法。如果程序员至
少定义了一个构造方法,那么系统不会再提供不带参数的构造方法。

当用new来创建对象时,需要提供类型相容的参数,否则编译器将报错。

在这里插入图片描述

这里在定义有参构造方法的时候,同时定义了一个无参构造方法,是为了让其他人在习惯性使用的无参构造方法创建
对象的时候不会报错,所以即使用不到这个无参构造方法也要定义上。

注意:

方法重载:一个类中方法名相同,参数列表不同,和返回值无关  
参数列表的不同:
			1 参数的个数不同
			2 参数的类型不同
			3 参数的顺序不同
是通过构造方法引出的这个现象,但是不是只有构造方法可以重载,我们自己定义的方法也可以重载方法。
重载的优势:可以在方法调用时,根据参数的类型自动的选择自己要执行的方法

3、this关键字和构造方法的调用

this关键字的作用,是用来显示地调用构造方法。它的使用格式如下:
构造方法名([参数列表]){
  [this([参数列表]);]
  语句序列
}
系统将根据参数列表来决定调用哪一个构造方法。使用this时还需注意下面几点:
 1. 用this调用构造方法时,该语句只能用在构造方法中。
 2. this语句必须是构造方法中的第一条语句。
 3. 和new不同,this虽然可以调用构造方法,但它只是执行构造方法中的语句,并不会创建对象。
 4. this()和super()不能同时存在

在这里插入图片描述

在main()方法中利用无参数的构造方法来创建对象,而在无参数的构造方法中,用this来调用带参数的构造方法,然
后再输出一条信息。注意this调用构造方法只能作为第一条语句。之所以这么做的原因在于,很多情况下,多个构造
方法可能会做相同的事情,只是参数有点区别,这就可以将这段相同的代码单独抽取出来成为一个构造方法,然后使
用this来调用它。

4、super关键字和构造方法的调用

super关键字的作用,如果子类和父类中有相同的方法,希望调用父类中方法时可以使用super调用
如果类处于一条继承链上,他可以调用自己父类和父类以上的类中的公共方法.它的使用格式如下:

构造方法名([参数列表]){
  [super([参数列表]);]
  语句序列
}

通过super(向上)关键词,验证父子之间的位置关系。使用super时还需注意下面几点:
1. this语句必须是构造方法中的第一条语句
2. super可以调用父类的变量,此时要注意访问权限修饰符
3. 类的默认的无参构造方法中,默认有一句super()
4. this()和super()不能同时存在

在这里插入图片描述
在原来的Animal类中添加eat()方法,在子类中重写,在子类构造方法中,直接调用eat()方法和用super关键字调用eat()方法。
在这里插入图片描述
在main()方法中利用Cat类的无参数的构造方法来创建对象,而在无参数的构造方法中,用suoer来调用父类中的带参数的构造方法,然后再输出一条信息。可以从输出中看出父类对象是优于子类对象先存在的,父类的构造方法优于子类的构造方法先执行。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值