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

} 
} 

Cuando corro el código que estoy error al buscar los que dice que no nombre de la variable estática no se puede hacer referencia a un contexto estáticonombre de la variable no estática no se puede hacer referencia a un contexto estático

Respuesta

10

Eso es debido a que el nombre de las variables y el álbum no existe en el procedimiento principal, porque es estático, lo que significa que no puede acceder a los miembros del nivel de instancia. Usted necesitará una instancia de la clase Singer, de esta manera:

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

Sin embargo, a menos que se declare sus miembros/nombre del álbum con un modificador de acceso público, el código anterior fallará para compilar. Le recomendé escribir un getter para cada miembro (getName(), getAlbum(), etc.) para beneficiarse de la encapsulación. De esta manera:

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

} 

} 

Otra alternativa sería declarar el nombre y álbum como estática, a continuación, puede hacer referencia a ellos en la manera que quería originalmente.

+0

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

+0

BTW, el código anterior se compilará y ejecutará bien, si el nombre es privado ya que' main' también pertenece a 'Singer'. – khachik

0

Una opción es lo que Chris Hutchinson mencionó. El otro es declararlos estáticos.

main es un método estático. Por lo tanto, el nombre y el álbum deben declararse como estáticos.

private static String name; 
private static String album; 
1

Principal es un método estático. Las variables de instancia (variables definidas en la clase pero no marcadas como estáticas) no se pueden acceder desde un método estático sin hacer referencia a una instancia de la clase.

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

cuando cumplí este código no se produjo ningún error, pero cuando ejecuto este código aparece un error que dice como excepción en el hilo "principal" java.lang.NoClassDefFoundError: Singer –

0

Para ampliar más en la respuesta de Chris, que resulte técnicamente posible tener tantas instancias de la clase cantante como su memoria puede soportar, pero hay solo un ejemplo de la función principal de funcionamiento. Esto significa que intentar acceder a esas variables desde la función estática significa que no tiene idea de a qué instancia de la variable debería acceder, de ahí el error.

Puede hacer que las variables sean locales para la función principal, pero eso probablemente anulará el propósito del programa, ya que la lógica dictaría que puede haber más de un cantante (lo más probable). Un mejor plan de ataque sería crear una clase genérica que aloje la función principal, y luego crear una clase Singer dentro de esa (u otra parte) e instanciar instancias X de esa clase en su función principal e ir desde allí.

2

Se debe instanciar un miembro o clase no estático para poder existir. Entonces, el acceso a un miembro u objeto no estático de un miembro estático no garantiza que este miembro u objeto sea instanciado, entonces el acceso a él es imposible.

Deberá crear una instancia de su objeto no estático dentro de su contexto estático para hacerlo.

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

esta manera, se incluyen la creación de instancias del objeto Singer en un objeto estático, thuis asegurando que se crea una instancia correctamente antes de que se accede.

Cuestiones relacionadas