2010-11-19 87 views
8
class Singer 
{ 
String name; 
String album; 

public Singer(){ 
    name="Whitney Houson"; 
    album="Latest Releases"; 
} 

public static void main(String[] args) 
{ 
    System.out.println("Name of the singer is "+name); 
    System.out.println("Album Information stored for "+album); 

} 
} 

當我運行這段代碼我發現錯誤,說非靜態變量名稱不能從靜態上下文非靜態變量名稱不能從靜態上下文中引用

回答

10

這是被引用,因爲變量名和相冊不存在於主程序中,因爲它是靜態的,這意味着它不能訪問實例級別的成員。您將需要歌手類的一個實例,像這樣:

public static void main(String[] args) { 
Singer s = new Singer(); 
System.out.println("Name of the singer is " + s.name); 
System.out.println("Album information stored for " + s.album); 
} 

但是,除非你有一個公共訪問修飾符聲明你的名字/專輯的成員,上面的代碼將無法編譯。我建議爲每個成員寫一個getter(getName(),getAlbum()等),以便從封裝中受益。像這樣:

class Singer { 
private String name; 
private String album; 

public Singer() { 
    this.name = "Whitney Houston"; 
    this.album = "Latest Releases"; 
} 

public String getName() { 
    return this.name; 
} 

public String getAlbum() { 
    return this.album; 
} 

public static void main(String[] args) { 
    Singer s = new Singer(); 
    System.out.println("Name of the singer is " + s.getName()); 
    System.out.println("Album information stored for " + s.getAlbum()); 

} 

} 

另一種方法是將名稱和專輯聲明爲靜態,然後您可以按照您最初的設計方式引用它們。

+0

'... + s.name); ... + s.album);' – khachik 2010-11-19 16:01:57

+0

順便說一句,上面的代碼將編譯並運行良好,如果名稱是私有的,因爲'main'也屬於'Singer'。 – khachik 2010-11-19 16:05:04

0

Chris Hutchinson提到了一種選擇。另一個是聲明它們是靜態的。

main是一個靜態方法。所以名稱和專輯必須聲明爲靜態。

private static String name; 
private static String album; 
1

Main是一種靜態方法。實例變量(在類中定義但未標記爲靜態的變量)無法從靜態方法訪問,而無需引用類的實例。

public static void main(String[] args) 
{ 
    Singer singer = new Singer(); 
    System.out.println("Name of the singer is " + singer.name); 
    System.out.println("Album Information stored for " + singer.album); 
} 
+0

當我編寫這段代碼時,沒有發生錯誤,但是當我運行這段代碼時,給出了一個錯誤,就像線程「main」java.lang.NoClassDefFoundError中的異常:Singer – 2010-11-19 16:32:02

0

要擴展更多的克里斯的回答,您可以在技術上有歌手類作爲你的內存可以支持多個實例,但只有永遠一個主要功能運行的實例。這意味着試圖從靜態函數訪問這些變量意味着它不知道應該訪問哪個變量的實例,因此是錯誤。

您可以將變量設置爲主函數的本地變量,但這可能會破壞程序的用途,因爲邏輯會指示可能有多個歌手(很有可能)。更好的攻擊計劃是創建一個容納主函數的泛型類,然後在該函數內(或其他地方)創建一個Singer類,並在主函數中實例化該類的X實例並從那裏開始。

2

非靜態成員或類需要實例才能存在。然後,從靜態成員訪問非靜態成員或對象並不能保證此成員或對象被實例化,那麼訪問它是不可能的。

您將需要在靜態上下文中創建一個非靜態對象的實例。

class Singer { 
    String name; 
    String album; 

    // You will need the following to make your code compile, 
    // and the call to these getters within your 'main' function. 
    public getName() { 
     return name; 
    } 

    public getAlbum() { 
     return album; 
    } 

    public Singer() { 
     name="Whitney Houson"; 
     album="Latest Releases"; 
    } 

} 

public static void main(String[] args) { 
    Singer singer = new Singer(); 
    System.out.println("Name of the singer is " + singer.getName()); 
    System.out.println("Album Information stored for " + singer.getAlbum()); 
} 

這樣,你包括Singer對象的實例成靜態對象,保證的Thuis被訪問前它是正確實例。

相關問題