Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Lorenzo31 en 09 de Abril 2015, 18:40
-
Buenas tardes, ahi va mi respuesta
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?
non static variable this cannot be referenced from a static context
¿Por qué se obtiene este mensaje de error?
Bueno el metodo main al ser static, solo puede acceder a variables y metodos de su clase si son static también, sino se entiende que son variables y metodos de instancia y no de clase.
En concreto el error en el this, aunque ponga en static la variable y el metodo sigue persistiendo.
System.out.println ("Atributo 1 vale" + this.getAtrib1());
Al quitarlo compila y hace lo que queremos, deduzco que tiene que ver con que "this." hace referencia a la variable de instancia y no de Clase, aunque buscando no lo he podido confirmar cien por cien seguro.
Encontré esto para asegurarme de que no decía una barbaridad.
this
Al acceder a variables de instancia de una clase, la palabra clave this hace referencia a los miembros de la propia clase en el objeto actual; es decir, this se refiere al objeto actual sobre el que está actuando un método determinado y se utiliza siempre que se quiera hace referencia al objetoactual de la clase.
¿Cómo podemos solucionarlo para que se ejecute lo que pretendemos?
/**
* Write a description of class Test here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Test {
static int atributo1;
Test(int atrib) { atributo1 = 0; }
public static void main (String [] args) {
System.out.println ("Mensaje 1");
System.out.println ("Atributo 1 vale" + getAtrib1() );
} //cierre main
static public int getAtrib1() { return atributo1; }
} //cierre clase
También me funciona añadiendo Test.getAtrib1() pero no con el this.getAtrib1 lo que me dio la idea de pensar que this se referia al metodo o variable de instancia y no de clase.
System.out.println ("Atributo 1 vale" + Test.getAtrib1() );
P.D. por lo que veo no acierto con mi deducción del this.getAtrib1, si se refiere a la clase no a instancia, pero aun así me da error y no comprendo porque, poniendo todo static, en cambio Test.getAtrib1 no da error, aunque deberian ser lo mismo. Si alguien puede ilustrarme lo agradeceré porque no lo veo.
-
Hola Lorenzo, hay algunas cosas interesantes. Una es:
¿Esta línea entra en algún momento en juego: Test(int atrib) { atributo1 = 0; } ?
Para responder esto podemos hacer una prueba. Ejecuta con BlueJ void main y New Test. Luego cambia la línea por
Test(int atrib) { atributo1 = 5;}
¿Hay algún cambio?
Si escribimos esto:
Test(int atrib) {
System.out.println("Instancia de clase creada");
atributo1 = 5; }
¿Se ejecuta el constructor al invocar el main?
Finalmente suponiendo que esa línea entrara en juego, ¿para qué recibir un parámetro si no lo usamos?
Test.getAtrib1() es equivalente a getAtrib1(). Podemos decir que la segunda forma es una forma abreviada que tenemos de hacer referencia a los métodos de una clase, pero siempre podrían referenciarse anteponiéndoles el nombre de la propia clase.
Como dices con this estaríamos refiriéndonos a una variable de instancia.
No puedes usar this en un método static porque static hace referencia a algo común a todos los objetos que se creen de ese tipo. No puedes referirte a "esta instancia" cuando static está indicando que no es de instancia sino de clase.
Estos conceptos son un poco complejos pero se van asimilando a medida que se va estudiando y haciendo más ejercicios.
Saludos