Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。Java SE中有很多的关键字,其中比较典型的关键字就是final。下面我们一起来深入学习final关键字。
Java语言中final是一个关键字(key words),其表示的三个含义:final修饰的变量是常量,final修饰的类不可继承,final修饰的方法不可重写。
final关键字三个特性:final修饰的变量为常量、final修饰的类不可继承、final修饰的方法不可重写。
对于final修饰的变量,应该对基本类型和引用类型分开讨论:
基本类型为栈内存(-128~127情况下),一旦被final关键字修饰,其变量属性变为只读,不再进行写操作,否则编译报错。
引用类型为堆内存,一旦被final关键字修饰,则引用不再改变,但是引用所指向的对象是可以被修改的,Java语言并未提供任何方式使用对象恒定不变。示意代码如下:
public class FinalData {
private final Value value=new Value(22);
public static void main(String[] args) {
FinalData finalData=new FinalData();
//finalData.value=new Value(33); //编译报错 value为final类型
finalData.value.i++; // 编译通过 value所指向的对象可以修改
}
}
class Value{
int i;
public Value(int i){
this.i=i;
}
}
因为被final修饰的变量一定要在使用前被初始化,所以如果没在定义操作,一定在构造函数中初始化,这种情况称为空白final。示例代码如下:
public class FinalData {
private final int i;//基本类型示意
private final Value value;//引用类型示意
public FinalData(){ // 无参构造函数 空白final
i=1;
value=new Value(1);
}
public FinalData(int x){//有参构造函数 空白final
i=x;
value=new Value(x);
}
public static void main(String[] args) {
new FinalData();
new FinalData(22);
}
}
class Value{
int i;
public Value(int i){
this.i=i;
}
}
类使用final关键字修饰之后,该类不可被继承,可以起到保护该类的作用。实例代码如下:
final class FinalFatherClass{
}
class SonClass extends FinalFatherClass{ //编译报错 final类不允许继承
}
class FinalFatherClass{
final void f(){
System.out.println("FinalFatherClass f()");
}
}
class SonClass extends FinalFatherClass{
final void f(){//编译报错
// 子类中某一方法的方法签名(方法名+形参列表)与父类相同,即可认为子类中该方法重写父类方法
//因final方法不可被重写,顾此处编译报错
System.out.println("SonClass f()");
}
}
值得注意的是,子类虽不能重写父类final函数,但是可以继承父类final函数,示意代码如下:
public class TestFinal {
public static void main(String[] args){
FinalFatherClass son=new SonClass();
son.f(); //打印 FinalFatherClass f()
//因为子类未重写父类final函数,也不能重新父类final函数
//但子类可以继承父类final函数,所以调用父类 f() 打印 FinalFatherClass f()
}
}
class FinalFatherClass{
final void f(){
System.out.println("FinalFatherClass f()");
}
}
class SonClass extends FinalFatherClass{
}
从上面可以看到,final修饰的方法在特定的访问权限下可以被继承。
这是因为,方法是否被final修饰与方法的访问权限是两回事,没有任何关系,被final修饰的方法和未被final修饰的方法都可以自由的指定访问权限。
关于final关键字我们就讲到这里,当然final关键字在Java中的应用是灵活多变的,我们也应随机应变。我们也可以在动力节点在线的Java SE视频课程中参考其中的实例代码,深入理解掌握final关键字的使用。
提枪策马乘胜追击04-21 20:01
代码小兵87207-15 12:10
杨晶珍05-11 14:54
杨晶珍05-12 17:30