静态常量由于其编译原理的特殊性有时候比较难理解,下面就分情况举例,相信4个示例能帮大家很好地理解static 和 final关键字的使用。
编译期常量的这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,但不是机械替换。
final如果直接初始化,那么所有的相关值在编译的时候直接赋值,
相当于在Work中直接存在System.out.println("123456"),所以执行的时候并没有调用W,那么静态块也就没有执行。
public class Work {
public static void main(String[] args) {
System.out.println(W.s);
}
}
class W{
public static final String s = "123456";
static {
System.out.println("执行了静态块");
}
}
final如果在声明时没有初始化,那么就不会在编译的时候就不会直接赋值。
当需要调用的时候在执行相应的静态块来获取初始化的值。
public class Work {
public static void main(String[] args) {
System.out.println(W.s);
}
}
class W{
public static final String s;
static {
s = "123456";
System.out.println("执行了静态块");
}
}
下面两个结果一样:都执行静态块,因为都调用了Work
public class Work {
public static void main(String[] args) {
System.out.println(Work.s);
}
//正常
public static final String s = "123";
static {
System.out.println("执行了静态块");
}
}
public class Work {
public static void main(String[] args) {
System.out.println(Work.s);
}
//正常
public static final String s;
static {
s = "123";
System.out.println("执行了静态块");
}
}
静态块中的方法只有在第一次调用该类的时候执行。(编译的时候不可能调用)
转载请注明文章来源:http://blog.csdn.net/hepfei90/article/details/14212311