2015-07-19 37 views
0

編譯器說illegal modifier for parameter i
請告訴我我做錯了什麼。爲什麼我不能在Java構造函數中使用靜態變量?爲什麼我不能在java構造函數中使用靜態變量?

class Student5{ 

    Student5() { 
     static int i = 0; 
     System.out.println(i++); 
    } 

    public static void main(String args[]){ 
     Student5 c1 = new Student5(); 
     Student5 c2 = new Student5(); 
     Student5 c3 = new Student5(); 
    } 
} 
+0

請正確格式化您的代碼和問題。 – Turing85

+1

[在構造函數中初始化靜態final字段]的可能重複(http://stackoverflow.com/questions/5093744/initialize-a-static-final-field-in-the-thetructor) –

回答

4

因爲你在哪裏聲明i的:

Student5(){ 
    static int i=0; 
    System.out.println(i++); 
} 

,編譯器將其作爲構造函數的局部變量: 局部變量不能被聲明爲static。有關本地變量允許使用哪些修飾符的詳細信息,請參閱Section 14.4 of the Java Language Specification

從出現什麼樣的代碼是試圖做判斷,你可能想i是的Student5靜態成員,而不是在構造函數中的局部變量:

class Student5{ 
    private static int i = 0; 

    Student5(){ 
     System.out.println(i++); 
    } 

. . . 
} 
0

這就是語言是如何設計的。什麼,如果你想有另一場int名爲i在構造函數?然後i應考慮?另外,在調用構造函數之前初始化靜態字段,即在類初始化階段階段。只有在創建新實例時纔會調用構造函數。

想象一下,如果你加載和初始化一個類但不是創建一個新實例會發生什麼(應該發生)。

1

如果你想聲明static變量然後聲明它的構造之外,在一流水平這樣的 -

public class Student5{ 

    private static int i; 

} 
static

您聲明發生在你的構造函數是一個局部變量和局部變量不能static。這就是爲什麼你越來越 - illegal modifier for parameter i。最後初始化變量static您可以使用一個靜態初始化塊(儘管它不是強制性的) -

public class Student5{ 

    private static int i; 

    static { 
     i = 5; 
    } 

} 
0

靜態變量是可以在不具有類的實例引用變量。通過定義一個而不是一個構造函數,當你創建一個類的實例時會調用這個構造函數,這是矛盾的。要麼定義它沒有一個實例(在構造函數和靜態之外),要麼將它定義爲一個實例(在構造函數內而不是靜態的)。

你可能想重新考慮你實際上想要做什麼以及你是否真的需要一個靜態變量。

相關問題