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