Java 命名规则,拥有固定标识符的 static final基本数据类型(亦即编译期常数)都全部采用大
写字母(用下划线分隔单个标识符里的多个单词)。
对于基本数据类型,final 会将值变成一个常数;但对于对象句柄,final 会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。不能由于某样东西的属性是final,就认定它的值能在编译时期知道,
final int i4 = (int)(Math.random()*20);
static final int i5 = (int)(Math.random()*20);这两个就是随机数
如果我输出 对象1.i4,对象1.i5。对象2.i4,对象2.i5,在控制台上显示的是15,9和10,9
i4的值是唯一的,不是static变量,回因为new一个对象重新生成一个新值,但 i5的值不会由于创建了一个新 对象而发生改变。那是因为它的属性是static,而且在载入时初始化,而非每创建一个对象时初始化。
空白final就是这样,final int a;如果我们这样写了,就需要对这个类的每个构建器中让a得到正确的初始化,就是赋值
自变量也可以是final,private void abc(final int a)意味着在一个方法的内部,我们不能改变自变量句柄指向的东西。如果自变量是一个对象句柄的话,就不能自变量=new的一个新对象。
final方法,一方面为了防止继承类改变它原有的含义,而是提高效率,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。类内所有private方法都自动成为final。由于我们不能访问一个 private方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。可为一个 private方法添加final 指示符,但却不能为那个方法提供任何额外的含义。
final类只是禁止继承。类无法被继承,那么其中的方法也无法继承。这也可以提高效率。final类会内嵌