Autor Tema: CU00683B metodos static java de clase o de instancia diferencias metodo main  (Leído 3116 veces)

Jarper

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 20
    • Ver Perfil
Buenas tardes,

 EJERCICIO

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
 
¿Qué mensaje de error se obtiene?
 - Se obtiene el mensaje de error: non-static variable this cannot be referenced from a static context.
¿Por qué se obtiene este mensaje de error?
- Estamos intentando acceder a un atributo de instancia desde un método de clase.
 
 ¿Cómo podemos solucionarlo para que se ejecute lo que pretendemos?
Código: [Seleccionar]
public class Test
{
    static int atributo1=57;
    /*Test(int atrib){
        atributo1 = 0;
    }*/
    public static void main(String[] args){
        System.out.println("Mensaje 1");
        System.out.println("Atributo 1 vale "+getAtrib1());
    }
    public static int getAtrib1(){return atributo1;}
}

He omitido el constructor ya que creo que no es necesario al tratarse de métodos de clase, no vamos a instanciar la clase.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
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

 

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