Java| Java關鍵字-static,final比較
static修飾符
1)static程式碼解釋:
/**
* static 不能直接修飾在類上,但是可以修飾在內部內中
*
* @author Yves He
*
*/
public class StaticTest {
/* 修飾成員變數 */
static String staticStr;
static int staticInt;
static double staticDouble = 2.0D;
/* static + final 修飾常量--此時由於final修飾一定要賦值,否則會報錯 */
static final String STATIC_FINAL_STR = "STATIC_FINAL_STR" ;
/* 修飾方法 */
static void showHello() {
}
/* 修飾內部類 */
static class StaticInnerClass {
}
public static void main(String[] args) {
System.out.println(StaticTest.staticStr); // null
System.out.println(StaticTest.staticInt); // 0
System.out.println(StaticTest.staticDouble); // 2.0
System.out.println(StaticTest.STATIC_FINAL_STR); // STATIC_FINAL_STR
}
}
2)總結:
1.靜態變數:
Static關鍵字用來宣告獨立於物件的靜態變數,無論一個類例項化多少物件,它的靜態變數只有一份拷貝。靜態變數也被成為類變數。區域性變數不能被宣告為static變數。2.靜態方法:
Static關鍵字用來宣告獨立於物件的靜態方法。靜態方法不能使用類的非靜態變數。靜態方法從引數列表得到資料,然後計算這些資料。3.靜態內部類
注意static修飾類時候只能是修飾內部類,不能修飾普通的類.類似靜態變數..
final修飾符
問題:
public final class Test {
/* 靜態變數沒有賦值時,原始型初始值為0,引用型初始值為null */
private static int staticAge;
private static String name;
/* 有final修飾的變數必須賦值,不管是靜態變數還是例項變數 */
private final String finalStr = "finalStr";// 必須賦值,否則會報錯.
private final String finalStr2;
private static final int STATIC_FINAL_AGE = 23; // 必須賦值,否則會報錯.
public Test() {
finalStr2 = "finalStr2";// final修飾的例項變數必須賦值,如果沒在直接賦值,就必須在例項構造器中賦值.
}
public static void main(String[] args) {
System.out.println(Test.staticAge);// 0
System.out.println(Test.name);// null
}
}
- 1.final 與 static 關鍵字可以用於哪裡?它們的作用是什麼?
final用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
static用於修飾類的成員屬性和成員方法,也可以修飾成員內部類.
具體作用見相關詳情. 2.static和final修飾的成員變數的初始值問題:
1)static修飾的欄位在類載入過程中的準備階段被初始化為0或null等預設值,而後在初始化階段(觸發類構造器)才會被賦予程式碼中設定的值,如果沒有設定值,那麼它的值就為預設值。
(MyOpinion: 是原始型變數0,引用型變數為null,因為是靜態變數是不需要例項化的.)
2)final修飾的欄位在執行時被初始化(可以直接賦值,也可以在例項構造器中賦值),一旦賦值便不可更改.
static final修飾的欄位在Javac時生成ConstantValue屬性,在類載入的準備階段根據ConstantValue的值為該欄位賦值,它沒有預設值,必須顯式地賦值,否則Javac時會報錯。可以理解為在編譯期即把結果放入了常量池中。
(MyOpinion: final修飾的變數必須賦值,不管是靜態變數還是例項變數都需要顯示的賦值,而且賦值後不能改變-原始型不能改變值,引用型不能改變引用,但是可以改變值.)
參考:http://blog.51cto.com/lavasoft/187713.能否在執行時向 static final 修飾的變數賦值?
MyOpinion: 不能,本質還是由於有final修飾所以必須直接在定義的時候賦值,或者在構造方法中賦值,但是由於是又有static修飾就變成了非例項變數賦值是在類載入的時候,而不是在例項化時賦值,所以就只能在定義的時候顯示賦值了)4. 使用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?
是引用不能變,引用的物件的值是允許變的,比如
final StringBuffer sb = new StringBuffer();
sb.append(Yves"");