Autor Tema: non static variable this cannot be referenced from static context Java CU00683B  (Leído 3277 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes, ahi va mi respuesta

Citar
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.

Código: [Seleccionar]
    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.

Citar
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?

Código: [Seleccionar]

/**
 * 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.
Código: [Seleccionar]
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.
« Última modificación: 10 de Abril 2015, 09:15 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
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

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".