二者表示的意義不同
static修飾的對象靜態的,可以通過類名或者類對象來對其進行訪問和修改
final修飾的對象表示常量,只能夠被賦值一次
如:static final int a=1; //a為常量
static int b=2; //可以多次被賦值
再如:當在類中創建一個類的對象時,會將該類的成員方法和變量都會在內存copy一份,如果創建對個對象明顯會比較占用內存(前提是對象沒有獨享這些成員的必要);
如果這是在類中定義了一個static變量,那么這個變量在內存中只能有一份拷貝,創建的對象可以共享該內存中的值(互相影響,互相改變),而如果是想這份共享內存中的值不可改變,可加final來進行修飾
static int b=1; //一份拷貝
final int c=2; //如果有多個實例,每個實例都會分別存儲final修飾的變量,且隨着程序的運行,內存會不斷地分配與釋放(如銷毀對象時)
final static int d=3;//只有一份拷貝,多個實例共享,且屬性為只讀,會一直占用內存,直到程序的終止
對於一些常量或者字符串等等,一般建議寫成static final類型(節省空間)
但須注意一點:final,static不能喝abstract同時來修飾變量和方法
如:public abstract int area(); //對的
public static abstratc int area(); //錯的