Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Dan_SB en 14 de Abril 2015, 06:59

Título: non-static variable this cannot be referenced from static context Java CU00683B#
Publicado por: Dan_SB en 14 de Abril 2015, 06:59
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í:
(http://i.imgur.com/v8Hb7YQ.png)

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
Título: Re:non-static variable this cannot be referenced from static context Java CU00683B#
Publicado por: Alex Rodríguez en 15 de Abril 2015, 10:28
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
Título: Re:non-static variable this cannot be referenced from static context Java CU00683B#
Publicado por: Dan_SB en 15 de Abril 2015, 16:53
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!