final 原義
final這個字很特別, 在Java中對變數是宣告為常數的意思. 而在一般方法中, 可以只宣告但不用初始化, 然後在其他行初始化一次. 第一次初始化之後, 其他地方就不能再次更改了, 如下
public static void main(String[] args){ final int a; System.out.println("宣告常數 a"); a=10; System.out.printf("a=%d\n",a); //a=20;此行錯誤, 不能指定二次 }
interface
在interface裏面宣告變數, 其特性是一定為 public static final, 且在interface裏, 不淮實作任何程式碼, 只能是方法原型宣告, 所以若宣告變數, 就一定要初始化, 如下
interface Land{
public static final int a=10;
}
Final Class
試著想一件事, Math.random()的特性是 0<=Math.random()<1之間, 若想要改寫此特性, 變成 1<=rnd()<=100, 是否有其他的方法呢?
先說明一下, 變更數數函數是沒意義的, 且會造成其他開發者的錯亂, 所以先給答案~~絕對不可能
如何破解這種事發生呢? 其實有個方式可以試一下, 如下
class MyMath extends Math{ public double random(){ return 10; } }
上述程式碼中, 可以繼承Math類別, 然後把不爽的方法給改寫掉, 這不就很圓滿了嗎!! 上面的結果是不淮繼承Math 類別
為什麼不能繼承Math類別呢, 原來 class Math前面加了final
智慧財產權保護
數學上的演算法, 1+1一定是2, 這是天則. Math類別加上final 是因為不想讓其他人隨意改變運算法造成不同人開發出來的演算法有不一樣的結果, 所以一定要加上final
本人為什麼要在自行開發的sdk中, 把class加上final呢! 因為不想讓其他人繼承我寫的class然後擴充更強的功能(方法). 想一想, 如果別人可以隨便更改(擴充)我寫的sdk, 那我為什麼要保護我的原始碼!!!