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

} 
} 

Kiedy uruchomić ten kod Jestem stwierdzenia błędu, który mówi, że nie statyczna nazwa zmiennej nie można odwoływać się od statycznego kontekścieniż statyczna nazwa zmiennej nie można odwoływać się od statycznego kontekście

Odpowiedz

10

to dlatego nazwa zmienne i Album nie istnieje w głównej procedurze, ponieważ jest statyczny, co oznacza, że ​​nie może uzyskać dostępu do członków na poziomie instancji. Trzeba będzie instancję klasy Singer coś takiego:

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

Jednak chyba zadeklarować członków Nazwa/Album z modyfikatorem publicznego dostępu, powyższy kod nie powiedzie się skompilować. Poleciłem napisanie gettera dla każdego członka (getName(), getAlbum(), itp.), Aby skorzystać z enkapsulacji. Tak:

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

} 

} 

Inną alternatywą byłoby zadeklarować nazwę i album jako statyczne, można odwoływać się do nich w sposób pierwotnie przeznaczone.

+0

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

+0

BTW, powyższy kod będzie się kompilował i działał poprawnie, jeśli nazwa jest prywatna, ponieważ' main' również należy do 'Singera'. – khachik

0

Jedną z opcji jest to, o czym wspomniał Chris Hutchinson. Drugim jest zadeklarowanie ich jako statycznych.

główny to metoda statyczna. Dlatego nazwa i album muszą być zadeklarowane jako statyczne.

private static String name; 
private static String album; 
1

Główny to metoda statyczna. Zmienne instancji (zmienne zdefiniowane w klasie, ale nie oznaczone jako statyczne) nie mogą być dostępne z metody statycznej bez odwoływania się do instancji klasy.

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

kiedy spełniłem ten kod, nie wystąpił błąd, ale kiedy uruchamiam ten kod, podany jest błąd, który mówi jak wyjątek w wątku "main" java.lang.NoClassDefFoundError: Singer –

0

Aby rozwinąć bardziej na odpowiedź Chrisa, można technicznie mieć wiele wystąpień klasy Singer jako pamięci może obsługiwać, ale jest zawsze tylko jedno wystąpienie głównego biegu funkcji. Oznacza to, że próba dostępu do tych zmiennych z funkcji statycznej oznacza, że ​​nie ma pojęcia, do której instancji zmiennej powinien mieć dostęp, stąd błąd.

Możesz ustawić zmienne lokalne na główną funkcję, ale to prawdopodobnie zniszczyłoby cel programu, ponieważ logika dyktuje, że może być więcej niż jeden piosenkarz (najprawdopodobniej). Lepszym planem ataku byłoby stworzenie ogólnej klasy, w której znajduje się główna funkcja, a następnie utworzenie klasy Singer w tym (lub w innym miejscu) i utworzenie instancji X tej klasy w głównej funkcji i przejście od tego miejsca.

2

Niestatyczny element lub klasa musi być instancją, aby istnieć. Uzyskanie dostępu do niestatycznego elementu lub obiektu z elementu statycznego nie gwarantuje utworzenia tego obiektu lub obiektu, a dostęp do niego jest niemożliwy.

Będziesz musiał utworzyć instancję swojego niestatycznego obiektu w swoim statycznym kontekście, aby go wykonać.

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

ten sposób można zawierać instancji obiektu Singer do statycznego obiektu, Thuis zapewniając, że jest tworzony poprawnie, zanim zostanie osiągnięty.

Powiązane problemy