java遗珠之字段初始化

字段初始化相对简单只是定义的时候设置初始化的变量就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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值