美文网首页Java基础
Java中final关键字总结

Java中final关键字总结

作者: tmp_zhao | 来源:发表于2020-04-26 21:04 被阅读0次

final关键字可以修饰类、方法、变量,具体如下:
1、被final修饰的类不可以被继承;
2、被final修饰的方法不可以被重写;
3、被final修饰的变量不可以被再次赋值;

说到第3点这里稍微多说个case,比如通过反射机制能否修改final字段呢?这个问题还是要分情况看的,如下:

情况1

class Obj {
    private final int a = 1;
    private final String b = "hello";
    public int getA() { return a;}
    public String getB() { return b; }
}

类似这样的代码,final关键字作用在基本数据类型或者字符串身上,那么在运行时,通过反射机制是无法修改a或者b的值的,原因是对这种情况下的getXXX方法,编译器做了优化,直接替换成了常量内容,即上面的getA()方法实际变成了如下的代码:

public int getA() { return 1; }

所以,你通过反射对字段的修改,无法通过getA()方法体现出来;

情况2

class Obj {
    private final int a; // 注意这里,只是声明没有同时赋值(即初始化)
    private final String b = "hello";
    public Obj() { a = 1; // 直到构造器里才赋值了 }
    public int getA() { return a;}
    public String getB() { return b; }
}

a字段在final定义的时候没有赋值,而是在ctor里才进行了赋值,那么此种情况下通过反射是可以修改a的值的,原因是此种情况下编译器不会进行情况1里的优化处理,所以getA()方法,返回的还是对a字段的引用。

情况3

class Obj {
    private final Integer a=1; // 注意这里a是Integer引用类型,而非原生类型
    public int getA() { return a;}
}

即使这里字段a在定义的时候就已经赋值了,但由于其是引用类型,而非基本数据类型,所以运行时通过反射当然是可以修改的。

相关文章

网友评论

    本文标题:Java中final关键字总结

    本文链接:https://www.haomeiwen.com/subject/wlxswhtx.html