2010-11-19 7 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); 

} 
} 

Wenn ich diesen Code ausführen i Fehler sind zu finden, die besagen, dass nicht statischer Variablenname kann nicht von einem statischen Kontextnicht statischer Variablenname kann nicht von einem statischen Kontext referenziert wird

Antwort

10

dass, weil der Variablen Name ist referenziert werden und Album existiert nicht in der Hauptprozedur, da es statisch ist, was bedeutet, dass es nicht auf Mitglieder auf Instanzebene zugreifen kann. Sie erhalten eine Instanz der Singer-Klasse benötigen, wie folgt aus:

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); 
} 

Allerdings, wenn Sie Ihren Namen/Album-Mitglieder mit einem öffentlichen Zugriffsmodifikator erklären, wird der obige Code nicht kompilieren. Ich empfehle das Schreiben eines Getters für jedes Mitglied (getName(), getAlbum(), usw.), um von der Kapselung zu profitieren. Wie folgt aus:

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()); 

} 

} 

Eine andere Alternative wäre, Name und Album als statisch deklarieren, dann können Sie sie in der Art und Weise verweisen Sie ursprünglich beabsichtigt.

+0

'... + s.name); ... + s.album); ' – khachik

+0

BTW, der obige Code wird kompiliert und läuft gut, wenn der Name privat ist, da' main' ebenfalls zu 'Singer' gehört. – khachik

0

Eine Option ist, was Chris Hutchinson erwähnt. Der andere ist, sie als statisch zu deklarieren.

main ist eine statische Methode. Name und Album müssen also als statisch deklariert werden.

private static String name; 
private static String album; 
1

Haupt ist eine statische Methode. Instanzvariablen (Variablen, die in der Klasse definiert sind, aber nicht als statisch markiert sind) können nicht von einer statischen Methode aus aufgerufen werden, ohne auf eine Instanz der Klasse zu verweisen.

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

als ich diesen Code erfüllte, trat kein Fehler auf, aber wenn ich diesen Code ausführe, wird ein Fehler ausgegeben, der wie Exception im Thread "main" sagt java.lang.NoClassDefFoundError: Singer –

0

Um mehr über Chris' Antwort zu erweitern, können Sie technisch so viele Instanzen der Singer-Klasse als Speicher unterstützen kann, aber es gibt immer nur eine Instanz der Hauptfunktion läuft. Dies bedeutet, dass der Versuch, von der statischen Funktion auf diese Variablen zuzugreifen, bedeutet, dass er keine Ahnung hat, auf welche Instanz der Variablen er zugreifen soll, daher der Fehler.

Sie können die Variablen lokal zur Hauptfunktion machen, aber das würde wahrscheinlich den Zweck des Programms zunichte machen, denn da würde die Logik diktieren, dass es mehr als einen Sänger geben kann (am wahrscheinlichsten). Ein besserer Angriffsplan wäre, eine generische Klasse zu erstellen, die die Hauptfunktion beherbergt, und dann eine Singer-Klasse innerhalb dieser (oder anderswo) zu erstellen und X-Instanzen dieser Klasse in Ihrer Hauptfunktion zu instanziieren und von dort aus zu gehen.

2

Ein nicht statisches Member oder eine Klasse muss instanziert werden, um existieren zu können. Der Zugriff auf ein nicht statisches Element oder Objekt von einem statischen Element garantiert nicht, dass dieses Element oder Objekt instanziiert wird, und der Zugriff darauf ist unmöglich.

Sie müssen eine Instanz Ihres nicht statischen Objekts in Ihrem statischen Kontext erstellen, um es zu erstellen.

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()); 
} 

Auf diese Weise schließen Sie die Instanziierung des Singer Objekt in ein statisches Objekt, thuis sichergestellt es richtig instanziiert wird, bevor sie zugegriffen wird.

Verwandte Themen