这篇来学习下构造方法的话题,首先什么是构造方法。所谓构造方法,就是这个类在被实例化时(创建对象时)就要执行的方法,方法名和类名相同。下面,主要从三个方面来学习构造方法:构造方法的定义,构造方法重载,构造方法内参数的初始化。
1. 构造方法定义
我们已经知道了构造方法是和类同名,其实还有其他的条件。构造方法是一定没有返回值的,所以不能有类型返回,连void都不可以有。构造方法前面可以用private,public,protected修饰,也可以不写,但是不能有static、final、synchronized、abstract关键字修饰。下面来看一个例子。
package javademo;
public class Car {
public String name ;
public double speed;
public String color;
public Car(){
this.name = "ford";
}
public Car(String name){
this.name = name;
}
public Car(double speed){
this.speed = speed;
}
public Car(double speed, String name){
this.speed = speed;
this.name = name;
}
}
上面代码,我们只看上面四个构造函数,不看构造函数内部代码。上面有四个构造函数,分别是Car(), Car(String name), Car(
double speed
), Car(
double speed, String name
),
构造函数的名称和类名称相同,前面不能有static或者返回类型的修饰。关于构造函数的定义,就可以像上面这样去写,下面我们讨论下构造函数内参数。
2.构造函数的重载
构造方法(函数)和普通的实例方法一样,也支持方法的重载(overload)。先复习一下什么是重载。重载就是方法名称相同,只是参数的个数,类型,顺序不同。Car(), Car(String name), Car(double speed), Car(double speed, String name)这四个就是构造方法的重载。第一个是没有参数的,第二个和第三个都是一个参数,只是参数类型不同,第四个是两个参数。构造函数写了好几个,那么,类初始化的时候到底调用哪个呢。
3.类初始化和调用构造函数方式
先说一下,如果一个类没有写构造函数。Java编译器会自动给你添加一个默认的什么也不干的构造函数。类的初始化是根据提供参数个数,类型来自动去匹配调用哪个构造函数,如果匹配不上,就好报错。下面我们新建一个main方法,来测试下构造函数的调用和类实例的初始化。
package javademo;
public class PassDataTypeMethodDemo {
public static void main(String args[]){
//调用构造函数Car(),参数为空
Car c = new Car();
System.out.println(c.name);
//调用构造函数Car(double speed),参数为speed
Car c2 = new Car(233.0);
System.out.println(c2.speed);
//调用构造函数Car(String name),参数为name
Car c3 = new Car("toyota");
System.out.println(c3.name);
//调用构造函数Car(doubel speed, String name),参数为name和speed
Car c4 = new Car(240, "BWM");
System.out.println(c4.name + " "+c4.speed);
}
}
运行结果:
ford
233.0
toyota
BWM 240.0
通过打印出来的结果,可以看到
调用了那个构造函数。这里先说说类的初始化, Car c = new Car(), 我们这里看到了new这个关键字,new表示新建一个对象,放在内存中。所以构造函数在调用的时间就是执行了new Car()就完成了调用。然后我们来思考下,构造方法中参数如果没有传参数是如何初始化的。很简单,你可以这样测试输出看看效果。
Car c = new Car();
System.out.println(c.name);
System.out.println(c.color);
System.out.println(c.speed);
你会发现,由于这个实例在初始化过程没有去管c
olor和speed的值是什么,但是运行结果我们看到color=null, speed=0.0 所以,在构造函数中基本数据类型的参数一定要进行初始化操作,如果没有,int型就是0,上面我们speed是doubel型,所以显示0.0,字符串默认返回null,char默认返回'\u0000',布尔型默认是false。