java中的final关键字

来源:互联网 发布:sem优化方案 编辑:程序博客网 时间:2024/06/05 02:14

final最基本的意思是不能改变

1.修饰数据

最常见的用法:

public static final int i= 1;

当然,初始化的值并不一定直接是基本数据类型:
final int i = (int)(Math.random()*20);
也可以是对象,这个时候只是表示这个对象句柄不能改变,但对象中的值仍然是可以改变的。
class IntValue {    int i = 1;}final IntValue v= new IntValue();v.i++;

有一种情况,final值定义的时候并未初始化,而是在构造器中进行初始化。(只能在构造器中初始化,且构造器中必须对其初始化)

final int i;//构造函数public Demo(){    i=1;}

除了修饰常数,也能修饰自变量,表示方法中不能修改变量值:

int g(final int i) {    //i++;// Can't change    return i + 1; }

2.修饰方法

之所以要使用final 方法,是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。采用final 方法的第二个理由是程序执行的效率(jvm会对final作适当优化),但这个理由并不是使用final的主因,而且也并不能总是保证提升效率,所以这里不作过多研究。

2.修饰类

如果说整个类都是final,就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。除此之外,也会有一些效率上的提升。

该类的数据成员既可以是 final,也可以不是。应用于final 的规则同样适用于这些数据成员,无论类是否被定义成final。

对于该类的方法来说,加不加final关键字,实际上它都有final的效果。

关于类是final,而数据成员不是final的情况,如下所示:

//直接报错,final明确表示不可继承//class FinalClassSon extends FinalClassFather{}final class FinalClassFather{    int i=1;    public void change(){i++;    }}public class FinalTest {    public static void main(String[] args) {           FinalClassFather f=new FinalClassFather();        f.change();        System.out.println(f.i);//类为final不代表类中的变量final        f.i++;        System.out.println(f.i);    }}


0 0
原创粉丝点击