非静态初始化主要用于对象的初始化操作,在每次创建对象时都要调用一次,其执行顺序在构造方法之前。
如果初始化块前有static关键字修饰,那么该初始化块称为静态初始化块。由于非静态成员不能在静态方法中使用,同样也不在静态初始化块中,因此静态初始化块主要用于初始化静态变量和静态方法。静态初始化块只调用一次,是在类被第一次加载到内存时,并非一定要创建对象才执行。
静态初始化块的执行顺序在非静态初始化块之前。
示例如下:
public class Test
{
public static void main(String[] args)
{
T a = new T();
T a2 = new T();
}
}
class T
{
{
System.out.println("==非静态初始化块==");
}
static
{
System.out.println("==静态初始化块==");
}
public T(){
System.out.println("==无参的构造方法==\n");
}
}
结果为:==静态初始化块==
==非静态初始化块==
==无参的构造方法==
==非静态初始化块==
==无参的构造方法==
通过上述示例可以看出静态初始化块仅在第一次创建对象时执行,第二次就没有执行,而非静态代码块则可以在每次创建对象都执行一次。
还有静态代码块是在类加载器第一次加载该类时调用,不一定非要创建对象才触发,如果使用“类名.静态方法(静态属性)”也会执行静态初始化块的。
如下例:
public class Test
{
public static void main(String[] args)
{
T.sayHi();
}
}
class T
{
static
{
System.out.println("==静态初始化块==");
}
public static void sayHi()
{
System.out.println("HelloWorld!");
}
}
结果: ==静态安初始化块==
HelloWorld
|