java学习之final修饰符

声明:此内容参考书籍《疯狂java讲义第二版》

final关键字用于修饰类、变量和方法。

final成员变量

final修饰的成员变量的值不能被修改,而且必须显式的指定初始值。
归纳起来,final修饰的类成员变量、实例成员变量能指定初始值的地方如下:
(1)类变量:必须在静态初始化块中或声明该变量时指定初始值。
(2)实例变量:必须在非静态初始化块、声明该变量或构造器中指定初始值。
image.png

final局部变量

系统不会对局部变量进行初始化,局部变量必须进行显式初始化。因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能对此变量赋值。
image.png
上面程序中示范了final修饰形参的情形,因为形参在调用该方法时,由系统根据传入的参数来完成初始化,因此使用final修饰的形参不能被赋值。
###final修饰基本类型变量和引用类型变量的区别
当使用final修饰基础数据类型变量时,不能对基础数据类型重新赋值,因此基础数据类型变量不能被改变,但对于引用数据类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用一个对象,但这个对象完全可以发生改变。
image.png

final方法

final修饰的方法不可以被重写。java提供的Object类中就有一个final方法:getClass(),因为java不希望任何类重新这个方法,所以使用final把这个方法封装起来,但对于该类提供的toString()和equals()方法,都允许子类重写,因此没有使用final修饰它们。
image.png
对于一个private方法,因为它仅在当前类可见,其子类无法访问该方法,所以子类无法重写该方法,如果子类中定义了一个与父类private方法有相同的方法名,方法参数,方法返回值,也不是方法重写,只是重写定义类一个新方法。
image.png

final类

final修饰的类不可以有子类,例如:java.lang.Math类就是一个final类,它不可以有子类。

当子类继承父类时,将可以访问到父类的内部数据,并可通过父类方法来改变父类方法的实现细节,可能导致不安全因素,破坏了封装。为了保证某个类不可被继承,则可以使用final修饰这个类:

public final class FinalClass{}
//下面的类定义将出现编译异常
class sub extends FinalClass{}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值