工学1号馆

home

java核心系列4–对象构造

By Wu Yudong on June 10, 2015

原创文章,转载请注明: 转载自工学1号馆

由于对象的构造非常重要,在java中提供了多种编写构造器的方式,本文将进行详细介绍

首先回顾一下前面讲到的java类的构造函数:

java在创建对象的时候会同时调用这个对象的构造函数完成对象的初始化工作。

使用构造函数时需要记住:

1.构造函数必须与类同名(如果一个源文件中有多个类,那么构造函数必须与公共类同名)

2.每个类可以有一个以上的构造函数

3.构造函数可以有0个、1个或1个以上的参数

4.构造函数没有返回值

5.构造函数总是伴随着new 新对象操作一起调用

重载

GregorianCalendar today = new GregorianCalendar();
GregorianCalendar deadline = new GregorianCalendar(2015,Calendar.DECEMBER, 31);

默认域初始化

如果在构造函数中没有显式地给域赋值,那么会自动地赋值默认值:数值为0、布尔值为false、对象引用为null

但这并不是一种良好的编程习惯。

无参数的构造器

很多类都会包含一个无参数的构造函数,对象有无参数的构造函数创建时,其状态会被设置成默认值。看个例子:

public Employee() {
	name = "";
	salary = 0;
	hirDay = new Date();
}

如果在编写一个类的时候没有编写构造器,那么系统会提供一个无参数的构造器

如果类中至少提供了一个构造器,但是没有提供无参数的构造器,这样在构造对象的时候如果没有提供参数则被视为非法

显式域初始化

可以在类定义中,直接将一个值赋值给任何域,例如:

Employee() {
	private String name = "";
	……
}

在执行构造函数前,先执行赋值操作

适用场景:当一个类的所有的构造器都希望把相同的值赋值某个特定的实例域的时候

初始值不一定是常量,还可以调用函数来初始化,看下面的例子:

class Employee{
	private static int nextId;
	private int id;
	//.......
	private static int assignId() {
		int r = nextId;
		nextId++;
		return r;
	}
}

调用另一个构造函数

如果构造的的第一条语句形如this(...),这个构造器将调用同一个类的另一个构造器,下面是一个典型的例子:

public Employee(double s) {
    this("Employee #" + nextId, s);
    nextId++;
}

初始化块

在一个类的声明中,可以包含多个代码块,只要构造类的对象,这些块就会被执行,例如:

class Employee{
	private static int nextId;
	private int id;
	private String name;
	private double salary;
	......
	//对象初始化块
	{
		id = nextId;
		nextId++;
	}
	public Employee() {
		name = "";
		salary = 0;
	}
	......
}

如果对类的静态域进行初始化的代码比较复杂,可以使用静态的初始化块,例如:

static {
	Random generator = new Random();
	nextId = generator.nextInt(10000);
}

下面来看个例子,将本文的知识做一次总结:

public class ConstructorTest {
	public static void main(String[] args) {
		Employee[] staff = new Employee[3];
		staff[0] = new Employee("wuyudong", 50000);
		staff[1] = new Employee(40000);
		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 = generator.nextInt();
	}
	
	//对象初始化块
	{
		id = nextId;
		nextId++;
	}
	
	//三种构造函数
	
	public Employee(String n, double s) {
		name = n;
		salary = s;
	}
	
	public Employee(double s) {
		//调用Employee(String, double)构造器
		this("Employee #" + nextId, s);
	}
	
	//默认构造器
	public Employee() {
	
	}
	
	public String getName() {
		return name;
	}
	public double getSalary() {
		return salary;
	}
	public int getId() {
		return id;
	}
}

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)