并不是static final 修饰的变量都是编译期常量
见代码
public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(Outer.Inner.n); // 输出结果 : 10 //情况二 //Outer outer = Outer.Inner.outer; // 输出结果 : 静态内部类 //情况三 System.out.println(Outer.Inner.str); // 输出结果: 静态内部类 abc //情况四 System.out.println(Outer.Inner.str01); // 输出结果: abc } } class Outer{ static class Inner{ public static final String str = new String("abc"); public static final String str01 = "abc"; public static final Outer outer = new Outer(); public static final int n = 10; static { System.out.println("静态内部类"); } } }
String 是一个比较特殊的类(str01: static final 修饰的变量不可变 , “abc”这个字符串也不可变)