final是Java中的一个关键字,可以用在声明变量,声明函数参数,声明函数,声明类四个地方。
1.声明变量:用final声明的变量,说明该变量不可修改,仅可初始化,也必须初始化,初始化的位置可以是构造函数中,构造代码块中,或者立即初始化(空白final)。By the way,final声明的变量如果是引用类型的话,是说明这个引用的地址不可改变,而引用所指的对象中的数据域是可以改变的。
public class Test
{
public static void main(String[] args)
{
A a = new A();
a.array[0] = 99; //引用地址没变
a.array = new int[2]; //引用地址改变,error
}
}
class A
{
public final int[] array = new int[5]//一定要初始化
}
2.声明函数参数:该变量不可修改
public static void f(final int a)
{
a = 2;//error
//eclipse:The final local variable a cannot be assigned. It must be blank and not using a compound assignment
}
public class Test
{
public static void main(String[] args)
{
A a = new A();
a.array[0] = 99; //引用地址没变
a.array = new int[2]; //引用地址改变,error
}
}
class A
{
public final int[] array = new int[5]//一定要初始化
}
public static void f(final int a)
{
a = 2;//error
//eclipse:The final local variable a cannot be assigned. It must be blank and not using a compound assignment
}
3.声明函数:该函数可继承,不可重写(子类仅有使用权,而没有修改权)。若父类中有一个函数用final关键字声明,那么他的子类就不可重写这个函数。另外,编译器会优化final声明的函数(内嵌调用),不过不应该依靠这种优化方式。
4.声明类:该类不可继承,在Java中,例如String、Math都是用final声明了的类,不可继承。
5.final和private:类中所有的private方法都隐式的指定为final,所以private方法无法被重写class Super
{
private void f()
{
}
}
class Sub extends Super
{
private void f() //并非覆盖父类中的f(),仅仅只是重名而已
{
}
}
class Super
{
private void f()
{
}
}
class Sub extends Super
{
private void f() //并非覆盖父类中的f(),仅仅只是重名而已
{
}
}
以上。