众所周知,当訪问一个类的变量或方法的时候。假设没有初始化该类。就会先去初始化一个类
可是,当这个类的变量为final的时候,就不一定了
请看以下的样例
package com.lala.shop; import java.util.Random; public class App { public static void main(String[] args) { System.out.println(User.c); } } class User { public static final int b = new Random().nextInt(11); public static final int c = 20; static { System.out.println("user static init ..."); } }
当訪问
System.out.println(User.c);
的时候,没有输出 "user static init ..."
由于c是static final变量。且它等于20。在编译的时候就能够知道它的值。所以直接訪问a的值不会引起User类的初始化
当訪问
System.out.println(User.b);
的时候。就输出"user static init ..."
这个static final变量b由于在编译的时候无法知道它的确切的值。所以仅仅有等到执行的时候才干知道,所以自己訪问
User.b会引起User类的初始化。也就是static静态代码快的载入