对象通常是有状态的,比如一个员工有姓名、年龄等字段。我们一般使用构造器对对象进行状态设置,本文将介绍使用静态和实例初始化块来对对象进行状态初始化的工作。
首先我们来看一个简单的例子,代码如下:
public class SmallSquares
{
private static final int LIMIT = 10;
private static final int[] square = new int[LIMIT];
public SmallSquares()
{
for (int i = 0; i < LIMIT; i++)
{
square[i] = i * i;
}
}
public static int getSquare(int i)
{
if (i < 0 i > LIMIT)
{
System.out.println("Error:the i should between 0 to 10");
return -1;
}
return square[i];
}
public static void main(String[] args)
{
new SmallSquares();
System.out.println("3 squared is " + getSquare(3));
}
}
这个小程序用来计算0-10的平方,这个程序是在构造器中对数组进行初始化的。其实这个构造器的唯一目的就是来初始化这个数组的。可是我们仔细考虑一下,这个类的功能比较简单,内部的状态也不复杂。但是假如要依靠构造器来初始化状态的话,显然不合适。我们每次必须要首先调用SmallSquares()才可以让程序工作,不然会出现NullPointerException。考虑用static初始化块来完成这个功能,使用它的话我们就可以不用构造器了,由于是static的,因此只会被执行一次。下面给出优化过的代码,注重绿色部分。
public class SmallSquares
{
private static final int LIMIT = 10;
private static final int[] square = new int[LIMIT];
static
{
for (int i = 0; i < LIMIT; i++)
{
square[i] = i * i;
}
}
public static int getSquare(int i)
{
if (i < 0 i > LIMIT)
{
System.out.println("Error:the i should between 0 to 10");
return -1;
}
return square[i];
}
public static void main(String[] args)
{
new SmallSquares();
System.out.println("3 squared is " + getSquare(3));
}
}