final关键字可以修饰类,变量,和方法,用于表示它修饰的类,方法,变量不可改变。final修饰变量时,表示该变量一旦获得了初始值就不可改变,final既可以修饰成员变量,也可以修饰局部变量,形参。final修饰的变量不可被改变,一旦获得了初始值,该final变量的值就不能被重新赋值
java语法规定;final修饰的成员变量必须由程序员显式地指定初始值。
类field:必须在静态初始化块中或声明该field时指定初始值
实例field:必须在非静态初始化块,声明该field或构造器中指定初始值
final局部变量
public class FInalLocalVariableTest
{
public void test (final int a)
{
a=5; //不能对final修饰的形参赋值,这个语句是非法的,因为形参在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰的形参不能被赋值
}
}
final修饰基本类型变量和引用类型变量的区别
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以改变
import java.util.Arrays;
class People
{
private int age;
public People(){}
public People(int age)
{
this.age=age;
}
public int setAge( int age)
{
return this.age;
}
}
public class FinalTest
{
public static void main(String args)
{
final int[] iArr={5,6,9,12};
System.out.println(Arrays.toString(iArr));
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
iArr[2]=8;
System.out.println(Arrays.toString(iArr));
final People p=new People(45);
p.setAge(23);
}
}
满足以下3个条件的类field,实例field,还是局部变量相当于一个直接量
1.使用final修饰符修饰
2在定义该final变量时指定了初始值
3该初始值可以在编译时就被确定下来
final方法
final修饰的方法不可被重写,如果出于某个原因,不希望子类重写父类的某个方法,则可以使用final修饰该方法
final类
final修饰的类不能有子类,为了保证某个类不被继承则可以使用final来修饰