从前面谈到的内容可以发现,当我们实例化一个类的对象后,如果想要为成员变量或者实例变量赋值,就必须通过这节访问对象的属性或者调用setter方法来设置。如果我们想在实例化对象的同时就为这个对象的属性赋值,这就可以通过构造方法来实现。接下来就解决两个问题。
- 构造方法的定义是什么?
- 构造方法的重载又该如何理解?
先来看第一个问题,构造方法也被称为是构造器,它是一个类的特殊成员会在类实例化对象的时候被自动调用。在一个类中定义的方法如果同时满足下面三个条件,就能称其为构造方法:
- 方法名与类名相同;
- 在方法的前面没有返回值类型的声明;
- 方法中不能使用return语句返回一个值。
下面用一个Demo来演示构造方法的使用:
上面代码的运行结果便是输出“无参的构造方法被调用了”。首先在SongKe类中定义一个无参构造方法。从运行的结果可以看到无参的构造方法被调用了。这是因为第4行代码在实例化SongKe对象的时候自动调用了构造方法,也就是说“newSongKe()”语句的作用除了会实例化SongKe对象,还会调用构造方法SongKe()。
当然在一个类中除了定义无参的构造方法,还可以定义有参的构造方法,通过有参的构造方法便能实现对属性的赋值。下面对上面的代码进行改造,演示如下:
运行结果输出“大家好,我叫胖妞”。上面的例子中在SongKe类中定义了有参构造方法SongKe(Stringname)。运行到第4行代码时会调用有参的构造方法,并传入参数“胖妞”。第12行代码便是将“胖妮”赋值给对象name的属性值。
接下来看第二个问题,什么是构造方法的重载了?
普通方法的重载是出现了重名的现象,而在一个类中也可以定义多个构造方法,只要每个构造方法的参数类型和参数个数不同即可。当我们在创建对象的时候,可以通过调用不同的构造方法为不同的属性赋值,下面就通过一个例子展示它的用法:
如上所示,在SongKe类中定义了两个构造方法,它们构成了重载。在创建sk1和sk2两个对象时,根据传入的参数不同分别调用不同的构造方法。
另外需要注意的是,在Java中每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。这个默认的是没有参数,方法体中也没有任何代码,即donothing。但当我们定义一个有参构造方法时会自动取代系统默认的无参构造方法,所以new对象的同时则必须传入一个参数,否则会引发编译报错。为了避免这种情况发生,在一个类中如果定义了有参的构造方法,最好再定义一个无参的构造方法。
关于构造方法当时确实让我头疼不已,总是不能理解既然可以通过直接设置为变量赋值,为何还要弄一个方法出来,搞得人晕头转向的。现在还是不太明白Java为何要这么设计,可能是更美观?Anyway总算理解个大概了。明天准备进入继承了,弄得构造方法算是打好一个基础。