Java中final关键字的使用
一.final可以修饰一个类
当一个类用final关键字来修饰的时候,此时这个类变为常量类
那么常量类有什么特征呢?
1.常量类不能被继承
举个例子:
//用final修饰一个Myclass类
final class Myclass{
//.....
}
//定义一个student类继承Myclass
class student extends Myclass{
//....
}
此时上述代码会报错如下图:
所以如果想从语法上对类的继承进行限制,可以使用final关键字来进行修饰类(谨慎使用)
2.常量类的成员变量可以按照需求设计为final
3.成员方法会被隐式的指定为final
二.final修饰成员方法
1.将方法进行锁定,以防止任何类通过继承来重写方法
2.优化程序,提高效率
3.只有明确禁止该方法在子类中被重写的情况下,才可以将该方法修饰为final(当基类的方法被声明为final时,就绝对共享了,派生类里不能够重写)
———修饰为final的成员方法在使用时,若一个基类的所有派生类在实现同一方法时,过程相同(即方法代码相同),可以将该方法在基类*享实现,设为final方法,为所有派生类共享
4.基类中的private方法将被隐式定义为final(任何情况下都不被派生类重写)
三.final修饰成员变量
1.成员变量被final修饰,则为常量,只读不能被修
2.一旦成员变量被final修饰,该类无论有多少个对象,所有对象的成员变量值都相同,且只读
3.如被final修饰,一定要先初始化(直接初始化或者构造初始化)
class Myclass{
private final int x;
private final int y;
public Myclass(){
x=0;
y=0;
}
public Myclass(int x,int y){
this.x=x;
this.y=y;
}
}
class Test{
public static void main(String[] args) {
Myclass my1 = new Myclass();
Myclass my2 = new Myclass(3, 4);
}
}
初始化之后单元被锁定,变为只读
四.final修饰引用
先明白两个概念:
1.常量指针----指针是常量
int * const p; //代表p是常量 ,指向不变,但指向单元里的内容可变
2.指针常量----指针是变量,指向的对象是常量
const int *p; //对象是常量
对比上述两个概念:
在Java中final修饰引用的话,即引用是常量(指向不变),但是对象不是常量(就是一旦指针引用一个对象,不可以再改变去引用其他的对象,但是要注意的是引用的对象里的值是可以改变的)
可以通过下图进一步理解:
五.final修饰局部变量(形参)
final修饰局部变量就是修饰一个普通的变量,要进行初始化,且替换执行
public void fun(final int x){
final int y=6;
x=5; //编译会出错(此语句的意思是3=5)在这里x是进行直接替换的
.....
}
....
my.fun(3);