我们在上一章中说到类与对象这个知识点,其中提到new一个对象的格式为:
//装逼模式
ClassName InstanceName =new ClassName();
//类名 对象名 =new 类的构造方法
在这里,我们说到关于类的构造方法,可能会存在一些让人觉得很混乱的地方,所以这一章就把构造方法提取出来,单独介绍。下面进入正题:
首先,我们来谈谈什么叫构造方法,既然都说了这是一个构造方法,那么很显然,它本质上就是一个方法。如果看到这里的你不知道什么叫做方法的话,可以先点击链接去看我的另一篇介绍方法的文章。
那么,既然作为一个方法,它应该有方法的样子吧。但是我们在上一章中发现,它除了回调一个Class();之后,也没见它有其他的定义方法的代码呀?这是因为,在未对类自定义构造方法的情况下,编译器会自动在编译期为其添加默认的构造方法。什么意思呢?就是说如果我们只是单纯地像下面这么写的时候:
Class Car{
int weight;
Color Color;
go(){
}
}
一旦我们开始创建对象,那么这段代码会被输入编译器进行编译,而在编译之前,有个幕后黑手为擅自为程序添加了这么一段代码,就变成了:
Class Car{
int weight;
Color Color;
//擅自添加的代码
Public Car(){
}
//添加代码结束
go(){
}
}
你看,这个幕后黑手添加的这段代码,是不是符合了一个无参方法?而这个,就是我们前面所调用的构造方法,因为它是编译器默认加入的,所以我们把这个叫做默认构造方法
当然,前面也说了,这是在我们未对类自定义构造方法的时候,编译器会给我们默认添加的。可是一旦我们对其自定义了构造方法之后,编译器就不当这个幕后黑手了,也就是说,编译器执行的是这么一个角色:你不弄?我就帮你弄,你要是弄了,我就不管这闲事了。
那么,这里又牵涉到一个问题:怎么自定义构造方法?别急,请往下看:
我们先来声明一下构造方法的含义:与类的名称完全相同,且不声明返回值类型的方法,称之为构造方法
什么意思呢?就是说,我们的构造方法的方法名,必须和类名一致,如果有一个字母的不相符,那么它都算不上是一个构造方法。这也是我们为什么说构造方法可以用类名()表示的原因。同时,作为一个构造方法,它是可以有参数的,比如说:
Class Car{
int weight;
Color Color;
//自定义的构造方法
Public Car(int weight,Color color){
this.weight=weight;
this.color=color;
}
//构造方法结束代码结束
go(){
}
}
你看,这就是我们自定义的一个构造方法,并且里面也传了参数。但是,如果我们往里面传递了参数的话,我们的回调构造方法的时候也需要加入参数,请看:
Car falali =new Car(4500,Color.black)
注意:我们在调用方法的时候,参数的顺序和你定义参数的顺序是要一致的,不能把参数位置交换
接下来,我们绕了一些弯之后,再来过九曲十八弯的河吧。
我们前面说了构造方法,无非两种情况:有构造方法的时候,不调用默认的构造方法,没有构造方法的时候,编译器自动添加默认的构造方法。
但是,基于这一结论的延伸,我们还有下面的一个知识点,就是:构造方法可以定义多个,但每次new一个对象的时候,只能调用一个办法。就好比你有好多辆的法拉利,但每一次你只能看一辆一样。那么,如果有多个构造方法的话,它是怎样的呢?一个简单的事例:
Class Car{
int weight;
Color Color;
//自定义的构造方法1
Public Car(int weight,Color color){
this.weight=weight;
this.color=color;
}
//构造方法1结束代码结束
//自定义的构造方法2
Public Car(int weight){
this.weight=weight;
}
//构造方法2结束代码结束
//自定义的构造方法3
Public Car(){
}
//构造方法3结束代码结束
go(){
}
}
在这里,我们自定义了三个构造方法,每一个的方法名都是一致的,但是参数却是不一致。并且你可以发现,其中竟然还有一个和默认构造方法一模一样的构造方法,但是要注意的是,这个是我们自己自定义的方法。和编译器无关,毕竟如果编译器不帮我们默认创建这个方法,而我们有时候有需要这个方法的时候,我们还是可以发挥求人不如求己的精神把它再一次创造出来,反正也只是代码的事。
从代码就可以看出,实际上我们可以写多个构造方法,但是要注意的是,每个构造方法的参数类型或者参数数量都是不一致的。决不能出现,同样数量的数据类型,按照相同的顺序排列的情况,这是绝对不允许的。请看几个例子:
事实上,关于构造方法为什么可以出现多个的问题,实际上涉及到了我们以后要学的一些内容,这里不仔细详说,只是知道有这种情况出现,并且知道构造方法的作用就好。
当然,既然要你们知道构造方法的作用,肯定也要说一下构造方法到底有何用户才行啦。
构造方法的作用
1.快速地初始化类的成员
什么意思呢?还记得在我们上一章中,我们是这样给类中的属性(类的成员)赋值的。
Car falali =new Car();
falali.weight=4500;
falali,color=Color.black;
在这里的时候,或许有人就说了,哎呀怎么这么麻烦,给变量赋值还要一句一句写。于是,我们的改进方法就是,利用构造方法,请看:
Class Car{
int weight;
Color Color;
//自定义的构造方法
Public Car(int weight,Color color){
this.weight=weight;
this.color=color;
}
//构造方法结束代码结束
}
在这里,我们自定义了一个构造方法,并且在方法里就已经实现了初始化成员变量的操作。所以我们要创建对象,并且给成员赋值的时候,就可以直接这么写:
Car falali =new Car(4200,Color.black);
如此,便可直接一步完成初始化变量成员的操作啦。
2.强制要求其它类给出某些数据
这个是什么意思呢?因为在面向对象编程中,几乎所有的类与类之间,都是可以相互调用的。如果说我们要在类A调用类B去处理问题,但是类B又需要类A传递某些数据过来才可以进行操作时,我们就可以通过在类B中添加构造方法,把所需的数据类型添加上去,那么当我们在类A去调动类B时,就可以在类A中创建类B的对象,并把类B所需要的数据通过构造方法传递给类B去处理问题。就好比你要让厨师给你做一盘红烧鱼,但是厨师说你要给我鱼,我才能帮你做。那你没办法,就只能再叫厨师帮你做鱼的同时,给厨师带上一条鱼,这样厨师才能给你弄鱼嘛。
好啦,关于一个类的构造方法,大致讲述如下,如果发觉有遗漏或者说的不对的地方,可以给我留言更正,谢谢。我们的下一章内容是:面向对象的三大特性之继承,敬请期待