Final关键字修饰的本质是什么

关于java中的final修饰的东西,有几大铁律,想必早已耳熟能详:
final修饰类表示该类不能被继承
final修饰方法,则表示该方法不能被覆盖(重写)。
final修饰属性,则表示该属性不会隐式的初始化,(类的初始化属性必须有值)。或在构造方法中赋值(但只能选其一)
【Final关键字修饰的本质是什么】But为何有这几大铁律呢?仅以我现在所能理解的知识思考一下。最近学了个编译语言,里面也提及了 常量 这一个概念,所以就联想到了java中的final。
X86版本的语言中,有一个伪指令,叫 equ, 意为定义一个常量!
下面看一段很简单的汇编指令,无需强制理解,不过大部分人应该能看懂:
Price equ, 100
mov ax, Price
mov bx, Price
mov cx, Price
解释一下:
Price equ 100, 定义一个常量,叫Price,值是100. 其中 equ就是其中的一个关键指令,是一个伪指令。伪指令的意思是这种指令实则可以用一定的真指令组合而成,但是往往是好几步真指令才能凑出来它的功能。但是因为编程中这种真指令拼凑出的场景实在太多,只好设定了几个伪指令来代替一些繁琐的步骤。实则编译器拿到了代码之后,还是把这些伪指令翻译成真指令的组合。
mov ax, Price 将Price所代表的值,也就是100,搬到ax寄存器里面去。 ax,是一个寄存器名称,这可是CPU硬件中实打实存在的一个器件,这个器件被硬件工程师定义名称叫做ax。
至于为什么你敲了这行代码,就会执行搬Price数据到ax寄存器,这其中的原因,建议看计算机原理相关知识。不做过多描述。
mov bx, Price 将Price所代表的值,也就是100,搬到bx寄存器里面去. bx也是一个寄存器的名称
mov cx, Price 与上方同理
当编译器见到
Price equ, 100
mov ax, Price
mov bx, Price
mov cx, Price
这些代码的时候,见到了equ这个伪指令,自己就会哗啦哗啦进行一定的动作,将其变成
全部的真指令。最后变着变着竟然成了这个样子:
mov ax, 100
mov bx, 100
mov cx, 100
最上面的一行Price equ, 100不见了,最终被翻译成的真指令合集只有3行代码。
所以,在编译语言里,他所指的常量,实则是一个连内存空间都不占的代号。编译器发现这个代号,就把后边它指定的值也就是100,统一进行替换!是一个替换操作而已。
那么java中的常量 (final修饰的那一堆),我认为其实内部也是大致相同的规则,要不为啥有条铁律说 final修饰的属性,得初始化。。如果真的是按照编译语言的规则来,你如果不进行初始化,我都不知道要替换成什么玩意儿。当然不行!

    推荐阅读