Java三大修饰符之final

final

1)final修饰的变量会固定一个值,从而成为了常量;

举个栗子:平常见到不被final修饰的变量是这样子的,int a = 100; a = 200; // 最后打印输出a为200,也就是说不被final修饰的变量值是可以更改的;

然而被final修饰的变量是这样式儿的:final int N = 100; N = 200; // 这里会编译出错,原因就是被final修饰的变量已经成为了一个固定值常量,为一个固定值常量赋值显然是不能编译通过的;

变量也分基本类型的变量和对象类型的变量;很显然,基本类型的变量中存储的就是数值,那么被final修饰后,就是数值不会再发生变化;那么对象类型中存储的是数据在内存中的首地址,‘一旦赋值,不能改变’就指得是这个对象不能再指向其他的首地址了;(注意:仅仅限制了对象指向的内存块首地址,但是地址中的属性、数据依然是灵活使用的)

2)final修饰属性

场景一:火眼金睛,看如下代码是否可以编译通过

class TestFinal{

  // final int value;// 注意:被final修饰的变量一旦赋值不可更改,也就是说这个对象属性在对象创建分配空间的时候就赋予了默认值0,且不能更改;这样一来,意义不大,所以对于final属性来讲,JVM在分配完空间后,并不会为其赋予默认值了,这样我们就可以在属性初始化 或者 调用构造方法时为属性赋予有意义的数值。

  // 上面一行代码就可以写成

  final int value = 100;// final变量在初始化的时候赋值。在使用属性初始化赋值为final变量赋值的时候,很有可能有创建了多个对象,对象的内存块中都保存了相同的属性值,这样就造成了空间浪费;我们之前有提到被static修饰的属性是全类共有的,并不属于某个对象,并且都指向同一块内存区域,所以我们可以将final与static关键字结合使用,。

  // 上面一行代码还可以写成

  final static int value = 100; // 注意此时被static修饰的final常量是全类共有的,在类加载的时候就分配空间的,因此final常量不能再使用构造方法赋值;只能选择在定义属性时赋值,或者在静态代码块中为其赋值。

注意:在使用构造方法为final常量赋值时,由于我们不能确定用户在创建对象的时候调用哪一个具体的构造方法,所以为了防止用户在创建对象的时候调用了没有给属性赋值的构造方法,我们需要将所有的构造方法对final常量赋值。

3)final修饰方法

final修饰方法,表示该方法不能被子类覆盖。

4)final修饰类

final修饰类表示此类不能被继承。(注意,final类不能被继承就表明类中所有方法都是不可以被覆盖的)

原文地址:https://www.cnblogs.com/LearnSB/p/13209054.html