final概念:
如果一個類被聲明為final,意味着它不能再派生出新的子類,不能作為父親被繼承。因此,一個類不能既被聲明為abstract,又被聲明為final。
將變量或方法聲明為final,可以保證它們在使用中不被改變。其初始化可以在兩個地方:
一是其定義處,也就是說,在final變量定義時直接給其賦值;
二是在構造函數中。
這兩個地方只能選其一,要么在定義時給值,要么在構造函數中給值,不能同時既在定義時給了值,又在構造函數中給另外的值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重寫。
final變量,代表該變量為常量,並且必須要賦值。
static final int i = 123;
或
static final int i; static { i = 123; }
String為什么是final類呢?
經過上面的敘述,可以說:
主要是為了“效率” 和 “安全性” 的緣故。若 String允許被繼承, 由於它的高度被使用率, 可能會降低程序的性能,所以String被定義成final。
Java並不是操作系統本地語言,換句話說Java必須借助操作系統本身的力量才能做事,JDK中提供的好多核心類比如String,這類的類的內部好多方法的實現都不是Java編程語言本身編寫的,好多方法都是調用的操作系統本地的API,這就是著名的“本地方法調用”,也只有這樣才能做事,這種類是非常底層的,和操作系統交流頻繁的,那么如果這種類可以被繼承的話,如果我們再把它的方法重寫了,往操作系統內部寫入一段具有惡意攻擊性質的代碼什么的,這不就成了核心病毒了么?