1、静态代码块:常规使用方法
public class StaticBlockTest {
public static void main(String[] args) {
Test test = new Test();
}
}
class Test
{
static
{
System.out.println("static block");
}
}
输出结果:static block
2、静态代码块与构造方法
public class StaticBlockTest {
public static void main(String[] args) {
Test test = new Test();
}
}
class Test
{
static
{
System.out.println("static block");
}
public Test()
{
System.out.println("Test Constructor");
}
}
输出结果:
static block
Test Constructor
原因:静态代码块在类加载的时候执行,而构造方法是在类创建实例的时候执行,静态代码块先于构造方法执行
3、静态代码块的执行次数:
public class StaticBlockTest {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
class Test
{
static
{
System.out.println("static block");
}
public Test()
{
System.out.println("Test Constructor");
}
}
输出结果:
static block
Test Constructor
Test Constructor
从运行结果可以看出,静态代码块只被执行了一次,原因是一个类的class文件只会被加载一次,静态代码块只会在类加载的时候执行;类的构造方法是毎生成一个实例就会调用一次
3、静态代码块的继承
public class StaticBlockTest {
public static void main(String[] args) {
new C();
}
}
class A
{
static
{
System.out.println("A static block");
}
public A()
{
System.out.println("A Constructor");
}
}
class B extends A
{
static
{
System.out.println("B static block");
}
public B()
{
System.out.println("B Constructor");
}
}
class C extends B
{
static
{
System.out.println("C static block");
}
public C()
{
System.out.println("C Constructor");
}
}
运行结果:
A static block
B static block
C static block
A Constructor
B Constructor
C Constructor
原因:静态代码块在类加载的时候执行,构造方法是在生产对象的时候执行;先执行静态代码块再执行构造方法。执行的顺序是先执行父类的静态代码块,再执行子类的静态代码块。要想调用某个类来生成对象,首先需要将类加载到Java虚拟机上,然后由JVM加载这个类来生成对象。
4、类的静态代码块只会执行一次,是在类被加载的时候,因为每个类只会被加载一次,所以静态代码块只会被执行一次;构造方法在每次生产一个对象的时候都会调用类的构造方法,所以每new一次就会执行一次构造方法
public class StaticBlockTest {
public static void main(String[] args) {
new C();
new C();
}
}
class A
{
static
{
System.out.println("A static block");
}
public A()
{
System.out.println("A Constructor");
}
}
class B extends A
{
static
{
System.out.println("B static block");
}
public B()
{
System.out.println("B Constructor");
}
}
class C extends B
{
static
{
System.out.println("C static block");
}
public C()
{
System.out.println("C Constructor");
}
}
运行结果:
A static block
B static block
C static block
A Constructor
B Constructor
C Constructor
A Constructor
B Constructor
C Constructor
总结:如果继承体系既有构造方法又有静态代码块,首先执行最顶层的静态代码块,一直执行到最底层类的静态代码块;然后再去执行最顶层类的构造方法,一直执行到最底层类的构造方法。静态代码块只会被执行一次。