重载:多个方法有相同的名字,不同的参数,便产生了重载。Java允许重载任何方法,而不只是构造器方法。因此,要完整第描述一个方法需要指出方法名以及参数类型。这种叫做方法的签名(signature)。例如,String类有4个称为indexOf的共有方法,他们的签名是:
indexOf(int)、
indexOf(int,int)、
indexOf(String)、
indexOf(String,int)。
返回类型不是签名的一部分,也就是说,不能有两个名字相同、参数类型也相同却返回不同类型的方法。
默认域初始化:如果构造器中没有显示地给域赋初值,那么就会自动被赋为默认值:数值为0,布尔值为false,对象引用为null。但是一般熟练的程序员不会这么做,会影响程序可读性。
无参数构造器:很多类都包含一个无参数的构造函数,创建时,状态设置为默认值。如果类中提供了至少一个构造器,但没有提供无参数的构造器,则在构造对象时如果没有提供参数,就会被视为不合法,例如:
Employee(String n,double s)对于这个类,如果调用Employee e=new Employee();将会产生错误。 提示:仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。
显示域初始化:通过重载类的构造器方法,可以采用多种形式设置类的实例域。确保不管怎样调用构造器,每个实例域都可以被设置为一个有意义的初值。可以在类定义中,直接将一个值赋给任何域。例如:
Class Employee
{
private String name=“”
}
调用另一个构造器:如果构造器的第一个语句如this(...),这个构造器将调用另一个构造器。例如:
public Employee(double s)
{
this("Employee #"+nextId,s);
}
当调用new Employee(60000)时,Employee(double)构造器将调用Employee(String,double)构造器。采用这种方法使用this关键字非常有用,这样对公共的构造器代码部分只编写一次就好了。
初始化块:再类的声明中,可以包含多个代码块,只要构造类的对象,这些块就会被执行。如:
class Employee{
private static int nextId;//定义一个静态域
private int id;
private String name="";//实例域初始化
private double salary;
{ //对象初始化块
id=nextId;
nextId++;
}
下面的程序展现了一下特性:
- 重载构造函数
- 用this(...)调用另一个构造器
- 无参数构造器
- 对象初始化块
- 静态初始化块
- 实例域初始化
import java.util.*;
public class ConstrutorTest {
public static void main(String[] args) {
Employee[] staff=new Employee[3];
staff[0]=new Employee("Harry",50000);
staff[1]=new Employee(60000);
staff[2]=new Employee();
for(Employee e:staff)
System.out.println("name="+e.getName()+",id="+e.getId()+",salary="+e.getSalary());
}
}
class Employee{
private static int nextId;//定义一个静态域
private int id;
private String name="";//实例域初始化
private double salary;
//静态初始化块
static{
Random generator=new Random();//将nextId设置为从0-9999之间的随机数
nextId=generator.nextInt(10000);
}
//对象初始化块
{
id=nextId;
nextId++;
}
//三个重载构造器
public Employee(String n,double s){
name=n;
salary=s;
}
public Employee(double s){//用this调用另一个构造器,即调用的是Employee(String,double)
this("Employee #"+nextId,s);
}
public Employee(){//默认构造器
}
public String getName(){
return name;
}
public double getSalary(){
return salary;
}
public int getId(){
return id;
}
}
输出结果: