1. 程式人生 > >Java| Java關鍵字-static,final比較

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/18771

  • 3.能否在執行時向 static final 修飾的變數賦值?
    MyOpinion: 不能,本質還是由於有final修飾所以必須直接在定義的時候賦值,或者在構造方法中賦值,但是由於是又有static修飾就變成了非例項變數賦值是在類載入的時候,而不是在例項化時賦值,所以就只能在定義的時候顯示賦值了)

  • 4. 使用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?
    是引用不能變,引用的物件的值是允許變的,比如
    final StringBuffer sb = new StringBuffer();
    sb.append(Yves"");