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

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Buenas noches!!

Vengo a resolver el ejercicio del capitulo 83° del curso. El enunciado dice así:

Intenta compilar el siguiente código:
Código: [Seleccionar]
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

1. ¿Qué mensaje de error se obtiene?

non-static variable this cannot be referenced from a static context

2. ¿Por qué se obtiene este mensaje de error?

Encontré 2 casos de como se podría arreglar:

Sin instancia:
En la clase main no se puede usar el this por ser static. También el atributo "atributo1" no esta declarado como static. El método getAtribi1 tampoco funciona porque no esta declarado static. Todo método que vas a usar en la clase que tenga el main, tiene que ser estatico, si se desea usar (esta mas decir que lo que se pone estatico es lo que se va a encontrar afuera del metodo main). Sera métodos de clase, no va a necesitar de objetos (o instancias).

Con instancia:
Hace falta crear un objeto Test. Así de simple. pero... ¿esto seria incorrecto?, ¿una mala practica como dicen...?

3. ¿Cómo podemos solucionarlo para que se ejecute lo que pretendemos?

Sin instancia:
Código: [Seleccionar]
public class Test {
      static int atributo1;
      Test(int atrib){atributo1 = atrib;}     
    public static void main (String[ ] Args) {
        atributo1 = 3;
        System.out.println ("Mensaje 1");
        System.out.println ("Atributo 1 vale " + getAtrib1());
    }

    public static int getAtrib1() {return atributo1;}
}

Con instancia: (¿Mala practica?)
Código: [Seleccionar]
public class Test {
      int atributo1;
      Test(int atrib){atributo1 = atrib;}     
    public static void main (String[ ] Args) {
        Test lol = new Test(3);
        System.out.println ("Mensaje 1");
        System.out.println ("Atributo 1 vale " + lol.getAtrib1());
    }

    public int getAtrib1() {return atributo1;}
}

La ejecución de ambos casos seria así:


Sin instancia es lo que se quiere (muy seguro) en este capitulo, solo hice la otra forma por curiosear un poco. Se podía hacer de ambas formas con lectores también para introducir cualquier valor del teclado!

Esperare sus comentarios y sus debidas correcciones en el caso que este en lo incorrecto.
Saludos
« Última modificación: 21 de Octubre 2020, 14:27 por Alex Rodríguez »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Dan, buenas respuestas.

Citar
Una forma de solucionarlo es

Con instancia:
Hace falta crear un objeto Test. Así de simple. pero... esto seria incorrecto, una mala practica como dicen...

Eso no siempre es una mala práctica, puede ser que en algunos casos concretos sea útil y necesario. En cada caso habrá que decidir, pero es bueno conocer ambas opciones. Crear una instancia de la clase con el main puede hacerse y puede ser útil. Lo que no debemos es usar la clase del main para cosas que no le correspondan, pero no hay problema si creamos una instancia para hacer algo necesario.


Saludos

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Oh!! vaya! no lo sabia! disculpadme, es que anteriormente me habían comentado algo sobre eso, y me dio a entender como que en el main eso era inapropiado..

Ahora ya se que depende del caso, es valido! Muchísimas gracias!
"Luchar por tus sueños y cumplirlos... eso es vivir.."

 

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