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