简单来说,一、static final修饰的只能是在常量池有字面量的数据类型,二、不能是引用类型,从设计者角度来说,为什么当初一可以通过,二不行?
一可行,最主要是为了提高程序的执行速度,因为static final在方法区中具有唯一性,只需要加载一次,在new对象时不需要分配堆内存,假设我们把static去掉,则每次new都需要分配堆内存,而final修饰在常量池中有字面量的数据类型是只读的,访问该量只是为了获得其中的值,我们无法改变其中的值,那这样只要有一个不就行了吗? 这点在非静态实名内部类中也说得通,所以一可行。
接着来看看二,先来说说为什么不可以具有static修饰的成员域,设计static目的:可以不通过实例化对象就进行访问。由于非静态实名内部类必须要通过一个实例化的外部类访问,与设计static的目的矛盾。接下来看看为什么不可以用static final修饰引用类型,当我们不希望指针改变时,我们才会使用static final,因此,使用static final的目的除了上述原因外,外加上一个不希望指针改变,由于我们还是要实例化外部类对象进行访问内部类,还是与设计初衷矛盾。