构造器,对定义的对象进行初始化。Java提供了多种编写构造器的方式。
重载
如果多个方法有相同的名字、不同的参数,便产生了重载。
编译器通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配,来挑选出相应的方法,成为重载解。
Java允许重载任何方法,而不只是构造器方法。
因此,要完整地描述一个方法需要指出方法名以及参数类型,这叫做方法的签名。
默认域初始化
如果构造器中没有显示地给域赋予初值,那么就会被自动地赋为默认值:数值为0,布尔型为false,对象引用为null
无参数的构造器
很多类都包含一个无参数的构造函数,对象由无参数构造函数创建时,其状态会设置为适当的默认状态值。
仅当类没有提供任何构造器时,系统才会提供一个默认的构造器(也是一个无参数构造器)
显式域初始化
不过怎样调用构造器,每个实例域都可以被设置为一个有意义的初值
参数名
在编写很小的构造器时,常常在参数名上出现错误
通常,参数用单个字符命名;或每个参数前加a;或参数变量与实例域相同,采用this.的形式访问实例域
调用另一个构造器
关键字this可以引用方法的隐式参数,也可以有下述用途。
public Employee(double s)
{
//调用同一个类的另一个构造器
this("Employee #"+nextId , s);
nextId++:
}
当调用new Emlopyee(60000)时,Employee(double s)构造器将调用Employee(String,double)构造器
这样,对公共的构造器代码部分只编写一次即可。
初始化块
之前有两种初始化数据域的方法:
在构造器中设置值
在声明中赋值
第三种方法:初始化块。
在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行
首先运行初始化块,然后才运行构造器的主体部分
示例代码:
package ObjectConstruct;
import java.util.Random;
public class ConstructorTest {
public static void main(String[] args){
//fill the staff with three Employee objects
Employee[] staff = new Employee[3];
staff[0] = new Employee("Harry",8000);
staff[1] = new Employee(12000);
staff[2] = new Employee();
//print out information about all Employee objects
for(Employee e : staff)
System.out.println("name = "+e.getName()+",salary ="+e.getSalary()+",id ="+e.getId());
}
}
class Employee{
private static int nextId;
private int id;
private String name = "";//实例域初始化
private double salary;
//static initialization block
//静态初始化块
static{
Random generator = new Random();
//set nexrId to a random number between 0 and 9999
nextId = generator.nextInt(10000);
}
//Object initialization block
//对象初始化块
{
id= nextId;
nextId++;
}
//three overloaded constructors
//三重载构造函数
public Employee(String n,double s){
name = n;
salary = s;
}
public Employee(double s){
//calls the Employee(String,double) constructor
this(",Employee #"+nextId, s);
}
//the default constructor
public Employee(){
//name initialized to --- see below
//salary not explicitly set --- initialized to 0
//id initialized in initialization block
}
public String getName(){
return name;
}
public double getSalary(){
return salary;
}
public int getId(){
return id;
}
}
输出示例:
name = Harry,salary =8000.0,id =9511
name = ,Employee #9512,salary =12000.0,id =9512
name = ,salary =0.0,id =9513