Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Jarper en 22 de Enero 2015, 16:36
-
Buenas tardes,
EJERCICIO
Intenta compilar el siguiente código:
public class Test {
int atributo1;
Test (int atrib) {atributo1 = 0;}
public static void main (String[ ] Args) {
System.out.println ("Mensaje 1");
System.out.println ("Atributo 1 vale" + this.getAtrib1());
} //Cierre del main
public int getAtrib1() {return atributo1;}
} //Cierre de la clase
¿Qué mensaje de error se obtiene?
- Se obtiene el mensaje de error: non-static variable this cannot be referenced from a static context.
¿Por qué se obtiene este mensaje de error?
- Estamos intentando acceder a un atributo de instancia desde un método de clase.
¿Cómo podemos solucionarlo para que se ejecute lo que pretendemos?
public class Test
{
static int atributo1=57;
/*Test(int atrib){
atributo1 = 0;
}*/
public static void main(String[] args){
System.out.println("Mensaje 1");
System.out.println("Atributo 1 vale "+getAtrib1());
}
public static int getAtrib1(){return atributo1;}
}
He omitido el constructor ya que creo que no es necesario al tratarse de métodos de clase, no vamos a instanciar la clase.
-
Hola Jarper.
Todo bastante bien. Solo comentar la respuesta a la pregunta:
¿Por qué se obtiene este mensaje de error?
Aclarando conceptos:
Método de instancia es el método invocado desde un objeto creado. Ejem:
Persona persona1 = new Persona(); // objeto persona1 de la clase Persona
persona1.getNombre(); // persona1 es una instancia de la clase Persona. getNombre es un método de instancia.
Método de clase es el método que se declara static en su clase. Ejem:
public static String getApellidos(); // este es un método de clase (suponemos que de la clase Persona)
Un método de clase se invoca así:
Persona.getApellidos();
Persona es la clase no un objeto de la clase persona. Y getApellidos() es un método estático (y de clase)
La respuesta correcta a la pregunta sería:
Porque invocamos un método de instancia getAtrib1() (no estático) dentro de un método estático (el main)
Tu solución es válida, aunque no es obligatorio omitir el constructor
También se puede hacer de la siguiente manera:
public class Test {
int atributo1;
Test (int atrib) {atributo1 = 0;}
public static void main (String[ ] Args) {
// Crear un objeto -instancia- de la clase Test
Test test1 = new Test(12);
System.out.println ("Mensaje 1");
// System.out.println ("Atributo 1 vale" + this.getAtrib1());
System.out.println ("Atributo 1 vale" + test1.getAtrib1());
} //Cierre del main
public int getAtrib1() {return atributo1;}
} //Cierre de la clase
En lugar de llamar al método getAtrib1() como si fuera método de clase this.getAtrib1() (es lo mismo que Test.getAtrib1()), cosa que no es.
El método getAtrib1() es método de instancia pues no es estático.
Lo llamamos como método de instancia. Declarando e inicialiando un objeto de tipo Test e invocando al método desde la instancia creada: test1.getAtrib1()
Puede que estos conceptos parezcan enrevesados. No te preocupes, ya le irás cogiendo el tranquillo a base de usar estos y otros recursos.
Saludos