jeje Hola buenos días, bueno veamos, el ejercicio original es el siguiente:
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
Como tu bien comentas en el primer post el error viene dado en esta linea:
System.out.println ("Atributo 1 vale" + this.getAtrib1());
Donde se intenta llamar al método getAtrib1() en un contexto estático (método main es estático) cuando el método resulta que no es estático, la clave esta en la palabra reservada this, digamos que de alguna manera this se sustituye en este caso por la palabra Test, con lo cual, la linea que nos esta generando el error es equivalente a la siguiente:
System.out.println ("Atributo 1 vale" + Test.getAtrib1());
Si ahondamos el la teoría, nombre_de_clase.nombre_metodo() --> Es la forma de llamar a un método que es estático dentro de la clase, pero en este caso resulta que getAtrib1() no es un método estático y por tanto el compilador como tu bien dices:
Non-static variable this cannot be referenced from a static context
Así que te comentaba que había dos soluciones, una ya la sabemos que es convertir tanto el método getAtrib1() como la propiedad atributo1 a estáticos.
La otra solución que te comentaba es crear un objeto, Pues simplemente es añadir una linea nueva dentro del main con la creación de un objeto de tipo Test y cambiar la palabra reservada this por el nombre que le hemos dado al objeto, con lo que el código quedaría de la siguiente forma:
public class Test {
int atributo1;
Test (int atrib) {atributo1 = 0;}
public static void main (String[ ] Args) {
Test t=new Test(5);
System.out.println ("Mensaje 1");
System.out.println ("Atributo 1 vale" + t.getAtrib1());
} //Cierre del main
public int getAtrib1() {return atributo1;}
} //Cierre de la clase
Si te fijas lo que hago es crear e inicializar un objeto llamado t y después en lugar de llamar al método directamente
this.getAtrib1()
Lo llamaríamos a través del objeto t que acabamos de crear de la siguiente forma:
t.getAtrib1()
Con lo cual la llamada al método ya no se hace de forma estática (Test.getAtrib1())
sino que lo hacemos a través de un objeto inicializado llamado t (t.getAtrib1())
No te preocupes si no entiendes muy bien cuando hacer una cosa o cuando hacer otra, con la practica te irás dando cuenta poco a poco.
Para ponerte un ejemplo, la clase java.lang.Math es una clase donde todos sus métodos no estáticos.
http://docs.oracle.com/javase/7/docs/api/java/lang/Math.htmlResumiendo un poco:
Yo me quedaría con lo siguiente, en un método estático no es posible llamar a métodos no estáticos de la misma clase ni a propiedades que tampoco sean estáticas dentro de la misma clase.
Pero ya te digo, no te preocupes porque poco a poco te irás dando cuenta de como actuar según lo que se te presente.
Un saludo y siento estas extensiones de post...