java修饰符final的深入理解

本文详述了Java中的final修饰符用法,包括final修饰变量(成员变量与局部变量的区别)、final修饰方法(防止重写)、final修饰类(禁止继承)以及不可变类的实现策略。内容源自《java疯狂讲义》,推荐学习。

本文主要是李刚老师的《java疯狂讲义》中的学习心得与笔记。《疯狂java讲义》是一本对java基础讲解比较深入的书,强烈推荐。
主要内容包括以下方面:

  1. final修饰符可修饰的内容
  2. final修饰变量
  3. final修饰方法
  4. final修饰类
  5. 不可变类

1.final可修饰的内容

final作为修饰符,可以修饰类、方法、变量。表示修饰的类、方法以及变量不可改变。

关于修饰符,有以下访问修饰符以及非访问修饰符。主要区别在于:(摘自w3cschool)

2.final修饰变量

final修饰变量时,是指该变量一旦获得初始值后,就不能重新赋值。这就意味着final修饰成员变量和修饰局部变量时存在着明显的不同,毕竟二者的初始化方法存在不同。

2.1 final 修饰成员变量

成员变量的初始化是随着类初始化或对象初始化开始的。

(1)类初始化时,系统自动分配类属性内存,并分配默认值;(发生在执行静态初始化块时)

(2)创建对象时,系统自动分配实例属性内存,也分配默认值。(发生在执行普通初始化块)

这说明,成员变量的的初始值包括:(1)定义是赋予默认值(2)初始化块(3)构造器中指定初始值。

当成员变量被final修饰以后,要么在定义成员变量时指定初始值。要么在初始化块赋予初始值。要么在构造器中赋予初始值。需要注意的是,如果在定义时指定了初始值,那么就不能再初始化块、构造器中为该属性重新赋值了。

2.2 final修饰局部变量

局部变量不会被系统自动进行初始化,需要程序员显式初始化,因此使用final修饰局部变量时既可以在定义时指定默认值,也可以不指定默认值。若定义时未指定默认值,后续只能指定一次。

2.3 final修饰基本类型和引用类型的区别

final修饰引用类型时,代表的是这个引用所引用的地址不会发生变化,但是该引用地址指向的对象完全可以发生改变。修饰基本类型的话,该变量则完全不能发生变化。

3.final修饰方法

final修饰方法代表着该方法不能被重写,用于父类某些方法不洗碗被重写的情况。

对于private修饰的方法,因为它仅在该类中可见,子类无法访问,所以子类无法重写,但是子类可以定义一个与父类中该方法完全同名、同参、同返回类型的方法,但这并不是重写。这是private修饰的方法与final修饰的方法的区别。当final与private同时修饰一个方法时,依然可以在子类中定义与父类同名、同参、同返回类型的方法

4.final 修饰类

final修饰类,代表着该类不能有子类,不能被继承。

5.不可变类

不可变类指的是创建该类的实例后,该实例的属性是不可改变的。

创建不可变类,可以采用以下方法

(1)使用private 和final修饰符修饰该类的属性

(2)提供参数构造器,用于根据传入参数来初始化类的属性

(3)仅编写该类属性的getter方法,不写setter方法,普通方法无法修改final修饰的属性

(4)重写Object类的hashcode()与equals()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值