深入理解Java的final关键字

1.final关键字有几种用法

(1)修饰变量

用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。final

修饰的变量可以先声明,后赋值。

final修饰基本类型时,起到常量的作用,基本类型的值不可变。

final修饰引用类型时,不能再指向其他的对象,但被引用的对象

的值是可以改变的(引用变量的值
实际上是它所引用的对象的地址)。

当用final作用于类的成员变量时,成员变量(局部变量只

需要
保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行

初始化赋值。

(2)修饰方法参数

编写方法时,可以在参数前面添加final关键字,它表示在整个方法中,不会(实际上是不能)改
变参数的值,具体类似于修饰数据。

即不能改变参数的值,但是可以改变引用类型参数的对象的
值。同时,即使没有final的修饰,参数的改变也不会影响到方法外的变量。

(3)修饰方法

final关键字修饰方法,它表示该方法不能被覆盖(重写)。另外,类中所有的private方法都隐
式地指定为是final的,由于无法在类外

使用private方法,所以也就无法覆盖它。此时可以在子类
中定义相同的方法名和参数,这种情况不再产生重写与final的矛盾,而是在子

类中
重新定义了新的
方法。可以对private方法添加final修饰符,但并没有添加任何额外意义。

(4) 修饰类

用final修饰的类是无法被继承的。且final类中的所有成员方法都会被隐式地指定为final方法。

  1. final 与 static 关键字区别?

static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变

运行代码,两次打印的j值都是一样的,而i的值却是不同的。

3.final变量和普通变量的区别

当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在

用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。而对于普通变量的访问却需要在运行时通过链接来进行。

final、static、static final修饰的字段赋值的区别

(1)static修饰的字段在类加载过程中的准备阶段被初始化为0或null等默认值,而后在初始化阶段
(触发类构造器)才会被赋予代码中设定的

值,如果没有设定值,那么它的值就为默认值。

(2)final修饰的字段在运行时被初始化(可以直接赋值,
也可以在实例构造器中赋值
),一旦赋值
便不可更改;

(3)static final修饰的字段在Javac时生成ConstantValue属性,在类加载的准备阶段根据
ConstantValue的值为该字段赋值,它没有默认 值,必须显式地赋值,否则Javac时会报错。
可以理解为在编译期即把结果放入了常量池中。

  1. final关键字的好处

final关键字提高了性能。JVM和Java应用都会缓存final变量。

final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

使用final关键字,JVM会对方法、变量及类进行优化。

final和abstract这两个关键字是反相关的,final类就不可能是abstract的

在匿名类中所有变量都必须是final变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值