Duda ejercicio java variable static

Iniciado por beginner6, 10 Noviembre 2014, 22:56 PM

0 Miembros y 1 Visitante están viendo este tema.

beginner6

Hola, me he encontrado este ejercicio que no entiendo, en el libro vienen las soluciones pero no la explicación, y como estoy aprendiendo por mi cuenta no tengo quien me lo explique:

class Prueba {
static int x = 5
public static int f() {
     x = 0
     return x;
}
public static void main (String [] args {
  System.out.println("Resultado = " + f() + "," + (++x));
}
}


Resultado = 0,1


class Prueba {
static int x = 5
public static int f (int x) {
     x = 0
     return x;
}
public static void main (String [] args {
  System.out.println("Resultado = " + f(x) + "," + ++x);
}
}


Y aquí imprime:
Resultado = 0, 6


Veo que en el segundo la función f toma x como parámetro, pero no entiendo porqué eso hace que x vuelva a valer 5 si el último valor que se le había dado era 0. ¿Alguien me lo podría explicar?

De antemano muchas gracias y saludos!!

JonaLamper

#1
Sí, pero cuando estás haciendo el System.out.println(f(x)); estás haciendo referencia a tu x del método, y según tu método, esa x retorna el valor que tiene (que es 0, pues se lo has asignado dentro del método). Pero cuando haces System.out.println(x); estás haciendo referencia a tu atributo estático que vale 5.

Quizá con nombres distintos lo veas mejor, mira:

Código (java) [Seleccionar]
class Prueba {
static int c = 5;
public static int f (int x) {
     x = 0;
     return x;
}
public static void main (String [] args) {
  System.out.println("Resultado = " + f(c) + "," + ++c);
}
}
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

someRandomCode

Exactamente como te han dicho, solo aportar que para acceder a la x estatica tendrias que usar this->x, dado que de otra forma el x de la funcion tiene precedencia

beginner6

Cita de: JonaLamper en 10 Noviembre 2014, 23:31 PMPero cuando haces System.out.println(x); estás haciendo referencia a tu atributo estático que vale 5.
Entendido, ¿y por qué no hace lo mismo el código de arriba?

En el primer código, no sé si es que imprime la x del método, o imprime la static que ha cambiado de valor (y si fuera así no entiendo porqué en el primero cambia de valor y en el segundo hay "otra" x independiente), según leí las variables estáticas solo pueden tener un valor, no es como las otras que se pasa una copia a cada método... Pero qué distinto es estudiar la teoría y luego ver la práctica... Muchísimas gracias por vuestro tiempo y respuestas :)


JonaLamper

#4
Porque en el primer código solo existe una x, la del static (que su valor es 5). Entonces esa x entra en el método y la modificas poniéndola a 0. Y en el segundo código tienes dos x. La primera es la del static y la segunda es el parámetro que recibe tu método.

Por eso no es buena idea poner los mismos nombres a los atributos que a las variables.

Y como creo que se lo que vas a preguntar ahora, te lo responderé. El segundo código hace lo siguiente (en mi código):

1.- c = 5 (estático).
2.- Al imprimir System.out.println(f(c)); el método recibe un 5 como parámetro de entrada, que se lo copia a la variable x.
3.- la variable x la pones a 0. Y ese es el valor que te muestra (pero el atributo estático c no ha cambiado su valor!)
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

beginner6

Cita de: JonaLamper en 11 Noviembre 2014, 09:01 AMPor eso no es buena idea poner los mismos nombres a los atributos que a las variables.
Ya ves, lo han puesto así para pillar jeje  :laugh:

Ahora sí está entendido, gracias mil!!