java遗珠之字段初始化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lastsweetop/article/details/82665398

字段初始化相对简单只是定义的时候设置初始化的变量就OK了

public class BedAndBreakfast {

    // initialize to 10     
    public static int capacity = 10;

    // initialize to false
    private boolean full = false;
} 

但是这种太过简单,一些复杂的比如包含抛出异常,逻辑控制等初始化操作就无法实现了。

为了实现一些复杂的初始化操作,实例变量在构造方法中可以初始化。尽管类变量也可以在构造方法中可以初始化,但是一是构造方法每次调用就会重置类变量,二是类变量的使用也不需要先进行调用构造方法再使用。

因此就需要一种机制在不用调用构造方法就可以实现类变量的复杂初始化。这个时候静态初始化块就出现了:

   static {
        // whatever code is needed for initialization goes here
        System.out.println("static initialization block");
    }

静态化初始化块在一个类中可以有多个,运行时系统会保证他们按照源代码中的出现顺序一一调用。

有时候初始化需要被重复调用,比如在之后就像类变量的重置,那么就需要可以复用的机制,那么静态初始化方法就出现了

class Whatever {
    public static int myVar = initializeClassVariable();

    private static int initializeClassVariable() {

        // initialization code goes here
        return 0;
    }
}

实例变量可以通过构造器来进行初始化,但是想要多个构造函数想调用相同的初始化代码,你就可以考虑使用初始化块,编译器会将初始化块拷贝到多个构造器中。

  {
        // whatever code is needed for initialization goes here
        System.out.println("initializing instance members");
    }

同样的想要复用这段代码块也可以把它提取成方法,但是最好设成final的,这样子类无法重写,否则对同一个变量子类和父类的初始化值不同可能会引起混淆。

public class Whatever2 {
    private int myVar = initializeInstanceVariable();

    public int getMyVar() {
        return myVar;
    }

    protected  final int initializeInstanceVariable() {

        // initialization code goes here
        return 0;
    }
}

猜你喜欢

转载自blog.csdn.net/lastsweetop/article/details/82665398