本文主要是李刚老师的《java疯狂讲义》中的学习心得与笔记。《疯狂java讲义》是一本对java基础讲解比较深入的书,强烈推荐。
主要内容包括以下方面:
- final修饰符可修饰的内容
- final修饰变量
- final修饰方法
- final修饰类
- 不可变类
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()方法。