对于final,可以在初始化时在运行时为其分配不同的值。例如Class Test{ public final int a;}Test t1 = new Test();t1.a = 10;Test t2 = new Test();t2.a = 20; //fixed因此,每个实例具有字段a的不同值。对于static final,所有实例共享相同的值,并且在首次初始化后不能更改。Class TestStatic{ public static final int a;}TestStatic t1 = new TestStatic();t1.a = 10;TestStatic t2 = new TestStatic();t1.a = 20; // ERROR, CAN'T BE ALTERED AFTER THE FIRST INITIALIZATION.
甲static变量保持在应用程序的整个生命周期的存储器,和类加载期间被初始化。static每次构造new对象时都会初始化一个非变量。通常最好使用:private static final int NUMBER = 10;为什么?这样可以减少每个实例的内存占用量。这对于缓存命中也可能是有利的。这很有意义:static应该用于在某种类型(aka class)的所有实例(aka对象)之间共享的事物。