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

Однако, если вы не объявлять членов/название альбома с модификатором общественного доступа, приведенный выше код не будет компилироваться. Я рекомендовал писать геттер для каждого члена (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

+0

BTW, приведенный выше код будет компилироваться и работать нормально, если имя является приватным, так как' main' принадлежит 'Singer'. – khachik

0

Один из вариантов - это то, что упоминал Крис Хатчинсон. Другой - объявить их статическими.

main является статическим методом. Поэтому имя и альбом должны быть объявлены как статические.

private static String name; 
private static String album; 
1

Главная - статический метод. Переменные экземпляра (переменные, определенные в классе, но не помеченные как статические) не могут быть доступны из статического метода без ссылки на экземпляр класса.

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 –

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 обеспечения его экземпляра правильно, прежде чем она доступна.

Смежные вопросы

 Смежные вопросы