Final关键字
在学习《Effective Java》的时候,学习到了各种各样之前在写代码中没有用到过的方法,在不可变类中,我们频频用到final关键字,还有在面试题中也有看到例如“final修饰究竟是引用不可变还是引用的内容不可变”之类的问题,非常考我们Java基础,所以记录一下我自己的复习过程填填坑。
- 类
- 方法
- 变量
类
当用final修饰一个类时,表示这个类不能被继承,也就是说,当我们不希望这个类被继承时,我们就用final修饰这个类,它的成员方法也默认为final的,但是成员变量是可以改变的,这么说可能比较难记,我们直接上代码演示:
我们先定义一个final修饰的father类
当我们想写一个Son类继承Father类的时候发现报错:不能从final的Father类继承
但是Final类的成员变量是可以改变的,我们也来测试一下:
方法
知道了final修饰类就是让类不可被继承,我们来看看当final修饰方法的时候有什么用处;引用《Thinking in Java》中的一段:“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。” 简而言之就是在被继承的时候,当我们不想某个方法被子类重写,我们就可以用final修饰这个方法,但是子类可以调用父类的final方法;我们也通过一段代码来演示:
方法没有加final修饰 方法被子类重写
方法加了final修饰 方法不能被子类重写
子类可以调用父类的final方法
变量
- final修饰的变量的值不能更改,即不能再次赋值,即使赋的新值与旧值一样也不可以,代码演示:
- final修饰的成员变量和局部变量需要在使用前赋值,对于成员变量,可以直接赋值,也可以在构造器中赋值,但是有多个同构造器的时候,每个构造方法都要有赋值语句。
- 如果静态成员变量被修饰为final,那么该变量可看成是全局变量,即在类的整个加载期间,其值都不可变。
- 当变量为基本数据类型时,变量的值不可更改;当变量为引用类型时,变量本身的值不可更改,即该变量不能指向其他的对象或数组;但该变量指向的对象或数组本身的内容是可以改变的;