final关键字能够修饰不一样的内容,这些内容仅包括一个变量,一个方法或者一个类,如下是final修饰这些内容的做用:java
当一个变量被final关键字修饰时,意味着它的值不能够被修改了,也就是说,这个变量表示一个常量。这也意味着final变量必须被初始化。若是一个final变量表示的是一个对象的引用,那么该变量就不能从新表示另外一个对象的引用了,可是这个final变量指向的对象的内部状态是能够改变的,例如,咱们能够向一个final array或者final collection中增长或者删除元素。另外,使用大写字母和下划线表示一个final变量是个好习惯。app
Exampleside
// a final variable final int THRESHOLD = 5; // a blank final variable final int THRESHOLD; // a final static variable PI static final double PI = 3.141592653589793; // a blank final static variable static final double PI;
初始化一个final变量函数
咱们必须初始化一个final变量,不然编译器将会抛出错误。一个final变量只能被初始化一次,能够经过初始化器或者初始化语句对其进行初始化。有三种方法能够初始化一个final变量:ui
Examplescode
//初始化final变量的方法 class Test { //直接初始化 final int THRESHOLD = 5; //blank final变量 final int CAPACITY; final int MAXMUM; //blanck static final变量 static final int MINIMUM; //使用初始化器 { CAPATICY = 25; } //使用static代码块 static { MAXMUM = 125; } //使用构造函数 public Test() { MINIMUM = -1; } }
何时须要使用final变量对象
一个普通变量和一个final变量之间惟一的区别就是一旦给final变量赋值,则该变量的值将不能够再被改变。所以,final变量只能用于咱们但愿在整个程序执行过程当中保持不变的值。继承
final变量的值是对象的引用编译器
当一个final变量是一个对象的引用,咱们把这个变量称为引用final变量(reference final variable),例如一个StringBuffer的final变量能够是final StringBuffer sb
,咱们知道一个final变量是不能够再从新赋值的,可是这个final变量指向的对象的内部状态是能够改变的,这种final属性能够称为非传递性。it
Examples
class Test { public static void main(String[] args) { // a final reference variable sb final StringBuilder sb = new StringBuilder("Test"); System.out.println(sb); // changing internal state of object // reference by final reference variable sb sb.append("ForTest"); System.out.println(sb); } } //输出为: //Test //TestForTest
a. final变量不能从新赋值,不然出现编译错误
b. 局部final变量必须在其建立后就对其进行赋值
c. 对比C++的const变量,const变量在声明的时候就须要赋初值,而final变量能够先声明再赋值,但只能赋值一次
d. foreach循环中,final修饰变量是合法的,栗子以下
// Java program to demonstrate final // with for-each statement class Test { public static void main(String[] args) { int arr[] = {1, 2, 3}; // final with for-each statement // legal statement for (final int i : arr) System.out.print(i + " "); } } //输出:1 2 3
这里能够这样使用的缘由是每次迭代时至关于从新对i进行了声明
final类没法被继承,有两种使用状况:
Integer
,Float
等都是final类一个被final修饰的方法是没法被重载的,对于一个含有final方法的父类,在其派生类中该方法必须和父类中的方法保持相同的实现
Example
class A { final void m1() { System.out.println("This is a final method."); } } class B extends A { void m1() { // COMPILE-ERROR! Can't override. System.out.println("Illegal"); } }