含义
构造器是创建对象的重要途径。对于java类,都至少要包含一个构造器。
(如果在一个类中,程序员并没有编写任何构造器,那么系统会自动默认给该类提供一个无参数的构造器)
作用
在创建对象的同时对其进行初始化。
创建
系统默认提供的构造器是无参数的、执行体为空,大概长这样子。
public class girl
{
private String name;
private boolean isSimple;
private float height;
public girl(){}
}
这种系统提供的默认的构造器是在创建对象的时候会进行默认的初始化,将数值型的实例对象初始化为0,将布尔类型的实例变量初始化为false,将所有引用类型(当然包括string 和char类型啦~)初始化为null。
要想改变这种系统默认的初始化,在创建对象的时候,能够初始化为我们想要的值,那么就需要我们自己编写构造器啦。
大概长这样子。
public class girl
{
private String name;
private boolean isSimple;
private float height;
public girl(int height,String name,boolean a)
{
this.name = name;
this.isSimple = a;
this.height = height;
}
}
注意在某类中自己进行定义了构造器之后,系统便不会再自动默认为你提供的构造器了。(系统只是“补救”)
构造器的可爱模样:public 类名(参数){}
注意想一想为啥要使用Public呢?
是因为使用Public 进行限定,使得其能够系统的任何位置的类创建该类的对象。
重载
那么如果比较贪婪,两个都好好哦,我都想要,怎么办?
很简单,自己创造呗,自己再写一个默认的构造器就是了~
大概长这样子
public class girl
{
private String name;
private boolean isSimple;
private float height;
public girl(){};
public girl(int height,String name,boolean a)
{
this.name = name;
this.isSimple = a;
this.height = height;
}
}
相应的我们还可以写、增加其他的构造器(毕竟女孩子怎么能够只有一两种构造的方式呢o( ̄︶ ̄)o)
就像函数重载一样,变换一下参数的数目和类型,就可以得到新的构造器了,这就是构造器的重载。
使用
说完了构造器的创建,下面看看我们如何使用构造器创建相应类的对象。那就要用到new关键字了。
构造器不能够直接被调用,构造器必须使用new关键字来进行调用。
大概长这个样子
public static void main(String[] args)
{
girl love = new girl(1.68,Fiona,true);
}
下面来让我们深刻的认识一下这条语句。
当使用new关键字调用构造器的时候,系统会先为该对象分配内存空间,并为这个对象进行默认的初始化,而这些操作的完成了,之后再进行构造器内部语句的执行。也就是说在执行构造器的执行体之前,系统就已经创建了一个对象,只是这个对象不能够被外部程序访问,只能够在构造器内部通过this来进行引用。当执行完相关的初始赋值语句之后,这个对象就会作为构造器的返回值返回。通过赋值给另一个引用类型的变量,从而使得外部程序能够访问该对象。
反映到上面这个例子上来,就是系统先进行创建了girl对象,并进行分配了相应的内存空间,之后进行执行构造器内部的语句对其进行初始化赋值,之后将这个对象返回给定义的引用变量love。(也就是让love指向这片内存空间)
特别
想一下,在构造器重载的时候,如果一个要新增的构造器里面的语句完全包含了之前一个构造器的语句,怎么办?如下图:
当然可以再重写一边,但是这也太笨了点 o(╥﹏╥)o
高颜值写法如下(见注释部分语句):
public class girl
{
private String name;
private boolean isSimple;
private float height;
private int weight;
public girl(){};
public girl(int height,String name,boolean a)
{
this.name = name;
this.isSimple = a;
this.height = height;
}
public girl(String name,boolean aa,int h,int w)
{
this(h,name,aa);//调用上一个构造器进行初始化。
this.weight = w;
}
}
使用this关键字来调用相应的构造器。
那么想一下可不可以用new 关键字来进行调用之前的构造器进行创建呢?
不能,因为使用new来调用的话,会导致系统重新创建一个对象,对那个对象进行初始化,而不是对这个构造器本身的那个对象进行初始化,所以不能。因此java才提供this关键字来进行调用相应的构造器,既能调用之前定义的构造器使用,又不会重新创建一个java对象。