java final关键字的一些理解

一、修饰变量

final修饰的变量必须初始化,且一旦初始化后不能再被修改,下面是初始化时机的具体分析:

1、修饰成员变量

不管是类变量(有static)还是实例变量(无static),可以在声明的时候就初始化。对于类变量来说,可以在类中声明final类变量,在类代码块中初始化,如下图所示。这是因为在类中声明定义类变量,编译器会将该代码移入类代码块中的相应位置;对于实例变量也类似,不过将类代码块换成构造器而已,由此可见jvm不会对final修饰的变量赋初值。

那对于类变量来说,可不可以在类中声明为final,在构造器中在对其进行初始化呢?看下图可知是不行的。因为类变量和实例变量的分配空间的时机不同。类变量实在类初始化时就已经分配空间了,而实例变量在新建对象时调用构造器对其进行分配空间,并进行初始化。因此,在构造器被调用之前类变量就已经有了内存空间了,编译器发现此时final修饰的类变量没有初始化就会报错。按道理说,成员变量在没有显示初始化的情况下,系统会自动赋初值0或null,由此也可以推断出jvm并没有为final修饰的成员变量隐式初始化。

2、修饰局部变量

java中局部变量必须显示初始化,jvm不会给局部变量隐式初始化,原因可能是一个方法中可能会声明多次,且声明周期可能各不相同,如果每次都默认初始化的话开销会很大,而且带来的效益并没有明显提升。final修饰局部变量时,只要在使用该变量前对其初始化即可,如下图所示:

3、修饰引用变量

指的是不能改变引用的指向,即只能指向同一处地址,但是能够修改指向对象的内容。

二、修饰成员方法

final修饰的成员方法不能被子类重写,但可以重载和调用。

三、修饰类

final修饰的类方法不能被继承,但可以创建对象。

四、修饰范围

final不能用来修饰构造器,因为final修饰的成员方法不能被重写,而构造器既不能被继承,也不能被重写,用final修饰符多此一举

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值