public interface IDao {
Thread thead = new Thread(){
{
System.err.println("IUserDao is init");
}
};
}
{ }
和static{ }
对比
被{ }
包括的代码块,会在每次实例化对象
的时候执行一次
而被static{ }
包括的代码块,会在类初始化
的时候执行一次
根据java语言的特性,
- 接口中的变量默认添加了
public static final
- 接口中的方法默认添加了
public abstract
java语言中
abstract
和static
或final
是不能共存的
有了以上两点作为前提,再根据 常量传播优化
所以只要IDao
接口被初始化,就会执行输出语句。
常量传播优化:被
static final
关键字修饰的变量(也就是可以确定值且该值不会再运行期间改变的变量,比如不包括UUID)会在编译期间将该变量初始化并存储到引用该变量的类的常量池中。